pythonsample函数取样,pythonsample函数取样_Pytorch各种
取样。。。
测试了pytorch的三种取样器⽤法。
⼀:概念
Sample:
取样器是在某⼀个数据集合上,按照某种策略进⾏取样。常见的策略包括顺序取样,随机取样(个样本等概率),随机取样(赋予个样本不同的
概率)。以上三个策略都有放回和不放回两种⽅式。
TensorDatat:
对多个数据列表进⾏简单包装。就是⽤⼀个更⼤的list将多个不同类型的list数据进⾏简单包装。代码如下:
classTensorDatat(Datat):
r"""Datatwrappingtensors.
Eachsamplewillberetrievedbyindexingtensorsalongthefirstdimension.
Arguments:
*tensors(Tensor):tensorsthathavethesamesizeofthefirstdimension.
"""
def__init__(lf,*tensors):
asrtall(tensors[0].size(0)==(0)fortensorintensors)
s=tensors
def__getitem__(lf,index):
returntuple(tensor[index]s)
def__len__(lf):
s[0].size(0)
⼆参数
tialSampler()
顺序采样,只有⼀个参数datat。返回以⼀个与数据集等长的迭代器。
Sampler()
data_source(Datat)–datattosamplefrom
replacement(bool)–samplesaredrawnwithreplacementifTrue,default=``Fal``放回/不放回采样
num_samples(python:int)–numberofsamplestodraw,default=`len(datat)`.Thisargumentissuppodtobespecified
onlywhenreplacementisTrue.采样的次数,采集⼏次即迭代器中有⼏个样本。
⼏个测试例⼦:
data1=(list(range(20,50)),dtype=)
sample1=RandomSampler(data1,replacement=Fal)
fori,dinenumerate(sample1):
print(i,d)
运⾏结果:
027
125
28
320
428
512
626
718
813
921
109
1122
1217
136
140
157
1614
1724
1810
1919
202
2129
2216
235
243
2511
261
274
2815
2923
如果采样不放回的采样,不能指定num_samples。也就是num_samples必须等于默认值len(datat)。随机不放回的取完集合。
edRandomSampler
weights(quence)–aquenceofweights,notnecessarysumminguptoone赋予每个样本权重。代表取到该样例的概率。数
据不均衡时可以⽤来控制不同类别样本的采样权重
num_samples(python:int)–numberofsamplestodraw
replacement(bool)–ifTrue,,theyaredrawnwithoutreplacement,whichmeans
thatwhenasampleindexisdrawnforarow,itcannotbedrawnagainforthatrow.
三使⽤⽅式
1.返回值。
注意以上每个取样器返回的都是样本在datat中的索引,并不是样本本⾝。
看上⾯的例⼦,datat是数值为30-50的列表。⽽遍历sample时,返回的是0-30的数值,代表采样样例的索引
2.取样器。
每次执⾏遍历取样器,取样器就会按照设定的⽅式进⾏⼀次取样。
data=(list(range(20)),dtype=)
sample=WeightedRandomSampler(list(range(20)),num_samples=10,replacement=Fal)
for_inrange(5):
print("******************************************")
fori,dinenumerate(sample):
print(i,d)
误解:samle是取样⼀次后存的结果,是⼀个值固定的迭代器。每次遍历的值⼀样。
实际结果:
******************************************
018
19
214
317
415
57
63
716
811
910
******************************************
016
19
218
38
44
519
617
711
815
910
******************************************
016
15
217
315
410
513
611
718
814
98
******************************************
017
118
216
313
43
511
619
714
812
99
******************************************
05
116
219
39
410
57
611
712
813
94
多次遍历sample,每次的值各不相同。也就是说每⼀次遍历都进⾏了⼀次取样。
3.与DataLoader⼀起使⽤
data=(list(range(20)),dtype=)
sample=WeightedRandomSampler(list(range(20)),num_samples=10,replacement=Fal)
daloloader=ader(data,batch_size=2,sampler=sample)
fori,dinenumerate(daloloader):
print(i,d)
结果:
0tensor([9,6])
1tensor([18,16])
2tensor([7,15])
3tensor([13,12])
4tensor([5,11])
这⾥执⾏的流程是。
⾸先sample在数据集datat上进⾏取样。dataloader按batch_size的⼤⼩每次读取批量的数据(采样后的数据)。
例如:数据集合⼀共有20个样例,⾸先⽤取样器取出10个样例。Dataloader会在取样后的数据每次读取批量的样例。如果batch_size是
2。那么dataloader的len是5。
本文发布于:2023-01-04 07:52:36,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/90/89562.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |