from nbdev.cli import *
数据核心
这里的类提供了将变换列表应用于项目集(TfmdLists
, Datasets
)或 DataLoader
(TfmdDl
) 的功能,以及用于收集模型训练数据的基类:DataLoaders
。
show_batch
是一个根据类型调度的函数,负责显示解码后的 samples
。x
和 y
是要显示的批次中的输入和目标,并根据它们的类型进行传递调度。例如,如果 x
是一个 TensorImage
或 TensorText
,则 show_batch
有不同的实现(更多详情请参见 vision.core 或 text.data)。可以传递 ctxs
,但函数在必要时负责创建它们。kwargs
取决于具体的实现。
get_show_batch_func
get_show_batch_func (x_typ=typing.Any, y_typ=typing.Any, samples_typ=typing.Any)
用于手动获取给定输入类型对应的 show_batch 函数的辅助函数。
show_results
是一个根据类型调度的函数,负责显示解码后的 samples
及其对应的 outs
。与 show_batch
类似,x
和 y
是要显示的批次中的输入和目标,并根据它们的类型进行传递调度。可以传递 ctxs
,但函数在必要时负责创建它们。kwargs
取决于具体的实现。
TfmdDL
TfmdDL (dataset, bs:int=64, shuffle:bool=False, num_workers:int=None, verbose:bool=False, do_setup:bool=True, pin_memory=False, timeout=0, batch_size=None, drop_last=False, indexed=None, n=None, device=None, persistent_workers=False, pin_memory_device='', wif=None, before_iter=None, after_item=None, before_batch=None, after_batch=None, after_iter=None, create_batches=None, create_item=None, create_batch=None, retain=None, get_idxs=None, sample=None, shuffle_fn=None, do_batch=None)
变换后的 DataLoader
类型 | 默认值 | 详情 | |
---|---|---|---|
dataset | 用于加载数据的 Map 风格或可迭代风格数据集 | ||
bs | int | 64 | 批次大小 |
shuffle | bool | False | 是否打乱数据 |
num_workers | int | None | 并行使用的 CPU 核数(默认:最多使用 16 个可用核) |
verbose | bool | False | 是否打印详细日志 |
do_setup | bool | True | 是否对批次变换运行 setup() |
pin_memory | bool | False | |
timeout | int | 0 | |
batch_size | NoneType | None | |
drop_last | bool | False | |
indexed | NoneType | None | |
n | NoneType | None | |
device | NoneType | None | |
persistent_workers | bool | False | |
pin_memory_device | str | ||
wif | NoneType | None | |
before_iter | NoneType | None | |
after_item | NoneType | None | |
before_batch | NoneType | None | |
after_batch | NoneType | None | |
after_iter | NoneType | None | |
create_batches | NoneType | None | |
create_item | NoneType | None | |
create_batch | NoneType | None | |
retain | NoneType | None | |
get_idxs | NoneType | None | |
sample | NoneType | None | |
shuffle_fn | NoneType | None | |
do_batch | NoneType | None |
A TfmdDL
是一个 DataLoader
,它从变换(Transform
)列表中为 after_item
、before_batch
和 after_batch
等 Callbacks 创建 Pipeline
。因此,它可以解码或显示处理过的 batch
。
class _Category(int, ShowTitle): pass
#Test retain type
class NegTfm(Transform):
def encodes(self, x): return torch.neg(x)
def decodes(self, x): return torch.neg(x)
= TfmdDL([(TensorImage([1]),)] * 4, after_batch=NegTfm(), bs=4, num_workers=4)
tdl = tdl.one_batch()
b type(b[0]), TensorImage)
test_eq(= (tensor([1.,1.,1.,1.]),)
b type(tdl.decode_batch(b)[0][0]), TensorImage) test_eq(
class A(Transform):
def encodes(self, x): return x
def decodes(self, x): return TitledInt(x)
@Transform
def f(x)->None: return fastuple((x,x))
= torch.arange(50)
start 2), fastuple((2,2))) test_eq_type(f(
= A()
a = TfmdDL(start, after_item=lambda x: (a(x), f(x)), bs=4)
tdl = tdl.one_batch()
x,y type(y), fastuple)
test_eq(
= tdl.decode_batch((x,y))
s type(s[0][1]), fastuple) test_eq(
= TfmdDL(torch.arange(0,50), after_item=A(), after_batch=NegTfm(), bs=4)
tdl 0], start[0])
test_eq(tdl.dataset[len(tdl), (50-1)//4+1)
test_eq(4)
test_eq(tdl.bs, '0\n1\n2\n3')
test_stdout(tdl.show_batch, =True), '0\n0\n0\n0') test_stdout(partial(tdl.show_batch, unique
class B(Transform):
= 'a'
parameters def __init__(self): self.a = torch.tensor(0.)
def encodes(self, x): x
= TfmdDL([(TensorImage([1]),)] * 4, after_batch=B(), bs=4)
tdl 0].a.device, torch.device('cpu'))
test_eq(tdl.after_batch.fs[
tdl.to(default_device())0].a.device, default_device()) test_eq(tdl.after_batch.fs[
方法
DataLoader.one_batch
DataLoader.one_batch ()
从 DataLoader
返回一个批次。
= NegTfm()
tfm = TfmdDL(start, after_batch=tfm, bs=4) tdl
= tdl.one_batch()
b 0,-1,-2,-3]), b) test_eq(tensor([
TfmdDL.decode
TfmdDL.decode (b)
使用 tfms
解码 b
详情 | |
---|---|
b | 要解码的批次 |
0,1,2,3)) test_eq(tdl.decode(b), tensor(
TfmdDL.decode_batch
TfmdDL.decode_batch (b, max_n:int=9, full:bool=True)
完全解码 b
类型 | 默认值 | 详情 | |
---|---|---|---|
b | 要解码的批次 | ||
max_n | int | 9 | 最大解码项目数 |
full | bool | True | 是否解码所有变换。如果为 False ,则解码到项目知道如何显示自身为止 |
0,1,2,3]) test_eq(tdl.decode_batch(b), [
TfmdDL.show_batch
TfmdDL.show_batch (b=None, max_n:int=9, ctxs=None, show:bool=True, unique:bool=False, **kwargs)
显示 b
(默认为 one_batch
),这是一个由 pipeline 输出组成的列表的列表(即 DataLoader
的输出)。
类型 | 默认值 | 详情 | |
---|---|---|---|
b | NoneType | None | 要显示的批次 |
max_n | int | 9 | 最大显示项目数 |
ctxs | NoneType | None | 用于显示数据的 ctx 对象列表。可以是 matplotlib 轴、DataFrame 等 |
show | bool | True | 是否显示数据 |
unique | bool | False | 是否只显示一个 |
kwargs | VAR_KEYWORD |
DataLoader.to
DataLoader.to (device)
将自身及其变换状态放在 device
上
DataLoaders
DataLoaders (*loaders, path:str|pathlib.Path='.', device=None)
围绕多个 DataLoader
的基本包装器。
类型 | 默认值 | 详情 | |
---|---|---|---|
loaders | VAR_POSITIONAL | 要包装的 DataLoader 对象。 |
|
path | str | pathlib.Path | . | 存储导出对象的路径 |
device | NoneType | None | 放置 DataLoaders 的设备 |
= DataLoaders(tdl,tdl)
dls = dls.train.one_batch()
x = first(tdl)
x2
test_eq(x,x2)= dls.one_batch()
x2 test_eq(x,x2)
可以使用 Dataloaders.add_tfms
将多个变换添加到多个 dataloaders 中。您可以通过名称列表 dls.add_tfms(...,'valid',...)
或索引 dls.add_tfms(...,1,....)
指定 dataloaders,默认情况下会将变换添加到所有 dataloaders。event
是一个必需参数,它决定了变换何时运行,有关事件的更多信息请参考 TfmdDL
。tfms
是一个 Transform
列表,也是一个必需参数。
class _TestTfm(Transform):
def encodes(self, o): return torch.ones_like(o)
def decodes(self, o): return o
= TfmdDL(start, bs=4),TfmdDL(start, bs=4)
tdl1,tdl2 = DataLoaders(tdl1,tdl2)
dls2 'after_batch',['valid'])
dls2.add_tfms([_TestTfm()],'after_batch',[1])
dls2.add_tfms([_TestTfm()], dls2.train.after_batch,dls2.valid.after_batch,
(Pipeline: , Pipeline: _TestTfm -> _TestTfm)
class _T(Transform):
def encodes(self, o): return -o
class _T2(Transform):
def encodes(self, o): return o/2
#test tfms are applied on both traind and valid dl
= DataLoaders.from_dsets([1,], [5,], bs=1, after_item=_T, after_batch=_T2)
dls_from_ds = first(dls_from_ds.train)
b -.5]))
test_eq(b, tensor([= first(dls_from_ds.valid)
b -2.5])) test_eq(b, tensor([
方法
DataLoaders.__getitem__
DataLoaders.__getitem__ (i)
获取索引 i
处的 DataLoader
(0
是训练集,1
是验证集)。
x2
tensor([ 0, -1, -2, -3])
= dls[0].one_batch()
x2 test_eq(x,x2)
DataLoaders.train
DataLoaders.train (x)
partial(func, *args, **keywords) - 创建一个新函数,其中部分应用了给定的参数和关键字。
DataLoaders.valid
DataLoaders.valid (x)
partial(func, *args, **keywords) - 创建一个新函数,其中部分应用了给定的参数和关键字。
DataLoaders.train_ds
DataLoaders.train_ds (x)
partial(func, *args, **keywords) - 创建一个新函数,其中部分应用了给定的参数和关键字。
DataLoaders.valid_ds
DataLoaders.valid_ds (x)
partial(func, *args, **keywords) - 创建一个新函数,其中部分应用了给定的参数和关键字。
FilteredBase
FilteredBase (*args, dl_type=None, **kwargs)
支持子集列表的基类
FilteredBase.dataloaders
FilteredBase.dataloaders (bs:int=64, shuffle_train:bool=None, shuffle:bool=True, val_shuffle:bool=False, n:int=None, path:str|Path='.', dl_type:TfmdDL=None, dl_kwargs:list=None, device:torch.device=None, drop_last:bool=None, val_bs:int=None, num_workers:int=None, verbose:bool=False, do_setup:bool=True, pin_memory=False, timeout=0, batch_size=None, indexed=None, persistent_workers=False, pin_memory_device='', wif=None, before_iter=None, after_item=None, before_batch=None, after_batch=None, after_iter=None, create_batches=None, create_item=None, create_batch=None, retain=None, get_idxs=None, sample=None, shuffle_fn=None, do_batch=None)
类型 | 默认值 | 详情 | |
---|---|---|---|
bs | int | 64 | 批次大小 |
shuffle_train | bool | None | (已弃用,请使用 shuffle )打乱训练集 DataLoader |
shuffle | bool | True | 打乱训练集 DataLoader |
val_shuffle | bool | False | 打乱验证集 DataLoader |
n | int | None | 用于创建 DataLoader 的 Datasets 大小。 |
path | str | Path | . | 放入 DataLoaders 的路径 |
dl_type | TfmdDL | None | DataLoader 的类型 |
dl_kwargs | list | None | 传递给每个 DataLoader 的 kwargs 列表 |
device | torch.device | None | 放置 DataLoaders 的设备 |
drop_last | bool | None | 丢弃最后一个不完整的批次,默认为 shuffle |
val_bs | int | None | 验证集批次大小,默认为 bs |
num_workers | int | None | 并行使用的 CPU 核数(默认:最多使用 16 个可用核) |
verbose | bool | False | 是否打印详细日志 |
do_setup | bool | True | 是否对批次变换运行 setup() |
pin_memory | bool | False | |
timeout | int | 0 | |
batch_size | NoneType | None | |
indexed | NoneType | None | |
persistent_workers | bool | False | |
pin_memory_device | str | ||
wif | NoneType | None | |
before_iter | NoneType | None | |
after_item | NoneType | None | |
before_batch | NoneType | None | |
after_batch | NoneType | None | |
after_iter | NoneType | None | |
create_batches | NoneType | None | |
create_item | NoneType | None | |
create_batch | NoneType | None | |
retain | NoneType | None | |
get_idxs | NoneType | None | |
sample | NoneType | None | |
shuffle_fn | NoneType | None | |
do_batch | NoneType | None | |
返回值 | DataLoaders |
TfmdLists
TfmdLists (items=None, *rest, use_list=False, match=None)
应用于项目集合的 tfms
Pipeline
类型 | 默认值 | 详情 | |
---|---|---|---|
items | list | 要应用 Transform 的项目 |
|
use_list | bool | None | 在 L 中使用 list |
decode_at
decode_at (o, idx)
索引 idx
处的解码项目
导出源码
def decode_at(o, idx):
"Decoded item at `idx`"
return o.decode(o[idx])
show_at
show_at (o, idx, **kwargs)
导出源码
def show_at(o, idx, **kwargs):
"Show item at `idx`",
return o.show(o[idx], **kwargs)
A TfmdLists
将对象集合与 Pipeline
结合在一起。tfms
可以是一个 Pipeline
或一个变换列表,在这种情况下,它会将其包装在 Pipeline
中。use_list
会与 items
一起传递给 L
,而 split_idx
会传递给 Pipeline
的每个变换。do_setup
表示初始化期间是否应调用 Pipeline.setup
方法。
class _IntFloatTfm(Transform):
def encodes(self, o): return TitledInt(o)
def decodes(self, o): return TitledFloat(o)
=_IntFloatTfm()
int2f_tfm
def _neg(o): return -o
= Transform(_neg, _neg) neg_tfm
= L([1.,2.,3.]); tfms = [neg_tfm, int2f_tfm]
items = TfmdLists(items, tfms=tfms)
tl 0], TitledInt(-1))
test_eq_type(tl[1], TitledInt(-2))
test_eq_type(tl[2]), TitledFloat(3.))
test_eq_type(tl.decode(tl[lambda: show_at(tl, 2), '-3')
test_stdout(float, float, TitledInt])
test_eq(tl.types, [ tl
TfmdLists: [1.0, 2.0, 3.0]
tfms - [_neg(enc:1,dec:1), _IntFloatTfm(enc:1,dec:1)]
# add splits to TfmdLists
= [[0,2],[1]]
splits = TfmdLists(items, tfms=tfms, splits=splits)
tl 2)
test_eq(tl.n_subsets, 0))
test_eq(tl.train, tl.subset(1))
test_eq(tl.valid, tl.subset(0]])
test_eq(tl.train.items, items[splits[1]])
test_eq(tl.valid.items, items[splits[0)
test_eq(tl.train.tfms.split_idx, 1)
test_eq(tl.valid.tfms.split_idx, 0)
test_eq(tl.train.new_empty().split_idx, 1)
test_eq(tl.valid.new_empty().split_idx,
test_eq_type(tl.splits, L(splits))assert not tl.overlapping_splits()
= pd.DataFrame(dict(a=[1,2,3],b=[2,3,4]))
df = TfmdLists(df, lambda o: o.a+1, splits=[[0],[1,2]])
tl 1,2], [3,4])
test_eq(tl[= tl.subset(0)
tr 2])
test_eq(tr[:], [= tl.subset(1)
val 3,4]) test_eq(val[:], [
class _B(Transform):
def __init__(self): self.m = 0
def encodes(self, o): return o+self.m
def decodes(self, o): return o-self.m
def setups(self, items):
print(items)
self.m = tensor(items).float().mean().item()
# test for setup, which updates `self.m`
= TfmdLists(items, _B())
tl 2) test_eq(tl.m,
TfmdLists: [1.0, 2.0, 3.0]
tfms - []
以下是如何使用 TfmdLists.setup
实现一个简单的类别列表,从模拟文件列表中获取标签
class _Cat(Transform):
= 1
order def encodes(self, o): return int(self.o2i[o])
def decodes(self, o): return TitledStr(self.vocab[o])
def setups(self, items): self.vocab,self.o2i = uniqueify(L(items), sort=True, bidir=True)
= _Cat()
tcat
def _lbl(o): return TitledStr(o.split('_')[0])
# Check that tfms are sorted by `order` & `_lbl` is called first
= ['dog_0.jpg','cat_0.jpg','cat_2.jpg','cat_1.jpg','dog_1.jpg']
fns = TfmdLists(fns, [tcat,_lbl])
tl = ['cat','dog']
exp_voc
test_eq(tcat.vocab, exp_voc)
test_eq(tl.tfms.vocab, exp_voc)
test_eq(tl.vocab, exp_voc)1,0,0,0,1))
test_eq(tl, (for o in tl], ('dog','cat','cat','cat','dog')) test_eq([tl.decode(o)
#Check only the training set is taken into account for setup
= TfmdLists(fns, [tcat,_lbl], splits=[[0,4], [1,2,3]])
tl 'dog']) test_eq(tcat.vocab, [
= NegTfm(split_idx=1)
tfm = TfmdLists(start, A())
tds = TfmdDL(tds, after_batch=tfm, bs=4)
tdl = tdl.one_batch()
x 4))
test_eq(x, torch.arange(= 1
tds.split_idx = tdl.one_batch()
x -torch.arange(4))
test_eq(x, = 0
tds.split_idx = tdl.one_batch()
x 4)) test_eq(x, torch.arange(
= TfmdLists(start, A())
tds = TfmdDL(tds, after_batch=NegTfm(), bs=4)
tdl 0], start[0])
test_eq(tdl.dataset[len(tdl), (len(tds)-1)//4+1)
test_eq(4)
test_eq(tdl.bs, '0\n1\n2\n3') test_stdout(tdl.show_batch,
TfmdLists.subset
TfmdLists.subset (i)
新的 TfmdLists
,具有相同的 tfms,仅包含第 i
个 split 中的项目。
TfmdLists.infer_idx
TfmdLists.infer_idx (x)
根据 x
的类型,找到可以对 x
应用 self.tfms
的索引
TfmdLists.infer
TfmdLists.infer (x)
根据 x
的类型,从正确的 tfm 开始将 self.tfms
应用于 x
def mult(x): return x*2
= 2
mult.order
= ['dog_0.jpg','cat_0.jpg','cat_2.jpg','cat_1.jpg','dog_1.jpg']
fns = TfmdLists(fns, [_lbl,_Cat(),mult])
tl
'dog_45.jpg'), 0)
test_eq(tl.infer_idx('dog_45.jpg'), 2)
test_eq(tl.infer(
4), 2)
test_eq(tl.infer_idx(4), 8)
test_eq(tl.infer(
lambda: tl.infer_idx(2.0))
test_fail(lambda: tl.infer(2.0)) test_fail(
Datasets
Datasets (items:list=None, tfms:MutableSequence|Pipeline=None, tls:TfmdLists=None, n_inp:int=None, dl_type=None, use_list:bool=None, do_setup:bool=True, split_idx:int=None, train_setup:bool=True, splits:list=None, types=None, verbose:bool=False)
从每个 tfms
创建元组的数据集
类型 | 默认值 | 详情 | |
---|---|---|---|
items | list | None | 用于创建 Datasets 的项目列表 |
tfms | collections.abc.MutableSequence | fasttransform.transform.Pipeline | None | 要应用的 Transform 或 Pipeline 列表 |
tls | TfmdLists | None | 如果为 None,则从 items 和 tfms 生成 self.tls |
n_inp | int | None | Datasets 元组中应视为输入部分的元素数量。 |
dl_type | NoneType | None | 调用函数 FilteredBase.dataloaders 时使用的默认 DataLoader 类型。 |
use_list | bool | None | 在 L 中使用 list |
do_setup | bool | True | 调用 Transform 的 setup() 方法 |
split_idx | int | None | 将 Transform 应用于训练集或验证集。0 表示训练集,1 表示验证集。 |
train_setup | bool | True | 仅将 Transform 应用于训练集 DataLoader 。 |
splits | list | None | 训练集和验证集的索引 |
types | NoneType | None | items 中数据的类型 |
verbose | bool | False | 打印详细输出 |
A Datasets
通过对 items
(通常是输入和目标)应用 tfms
中的每个 Transform
(或 Pipeline
) 列表来从 items
创建元组。请注意,如果 tfms
只包含一个 tfms
列表,则 Datasets
返回的项目将是包含一个元素的元组。
n_inp
是元组中应视为输入部分的元素数量,如果 tfms
包含一组变换,则默认为 1,否则为 len(tfms)-1
。在大多数情况下,Datasets
生成的元组元素数量为 2(用于输入和目标),但有时也可能为 3(例如 Siamese 网络或表格数据),在这种情况下我们需要能够确定输入的结束和目标的开始位置。
= [1,2,3,4]
items = Datasets(items, [[neg_tfm,int2f_tfm], [add(1)]])
dsets = dsets[0]
t -1,2))
test_eq(t, (0,1,2], [(-1,2),(-2,3),(-3,4)])
test_eq(dsets[1)
test_eq(dsets.n_inp, dsets.decode(t)
(1.0, 2)
class Norm(Transform):
def encodes(self, o): return (o-self.m)/self.s
def decodes(self, o): return (o*self.s)+self.m
def setups(self, items):
= tensor(items).float()
its self.m,self.s = its.mean(),its.std()
= [1,2,3,4]
items = Norm()
nrm = Datasets(items, [[neg_tfm,int2f_tfm], [neg_tfm,nrm]])
dsets
= zip(*dsets)
x,y 0)
test_close(tensor(y).mean(), 1)
test_close(tensor(y).std(), -1,-2,-3,-4,))
test_eq(x, (-2.5)
test_eq(nrm.m, lambda:show_at(dsets, 1), '-2')
test_stdout(
test_eq(dsets.m, nrm.m)
test_eq(dsets.norm.m, nrm.m) test_eq(dsets.train.norm.m, nrm.m)
= ['dog_0.jpg','cat_0.jpg','cat_2.jpg','cat_1.jpg','kid_1.jpg']
test_fns = _Cat()
tcat = Datasets(test_fns, [[tcat,_lbl]], splits=[[0,1,2], [3,4]])
dsets 'cat','dog'])
test_eq(tcat.vocab, [1,),(0,),(0,)])
test_eq(dsets.train, [(0], (0,))
test_eq(dsets.valid[lambda: show_at(dsets.train, 0), "dog") test_stdout(
= [0,1,2,3,4]
inp = Datasets(inp, tfms=[None])
dsets
*dsets[2], 2) # Retrieve one item (subset 0 is the default)
test_eq(1,2], [(1,),(2,)]) # Retrieve two items by index
test_eq(dsets[= [True,False,False,True,False]
mask 0,),(3,)]) # Retrieve two items by mask test_eq(dsets[mask], [(
= pd.DataFrame(dict(a=[5,1,2,3,4]))
inp = Datasets(inp, tfms=attrgetter('a')).subset(0)
dsets *dsets[2], 2) # Retrieve one item (subset 0 is the default)
test_eq(1,2], [(1,),(2,)]) # Retrieve two items by index
test_eq(dsets[= [True,False,False,True,False]
mask 5,),(3,)]) # Retrieve two items by mask test_eq(dsets[mask], [(
#test n_inp
= [0,1,2,3,4]
inp = Datasets(inp, tfms=[None])
dsets 1)
test_eq(dsets.n_inp, = Datasets(inp, tfms=[[None],[None],[None]])
dsets 2)
test_eq(dsets.n_inp, = Datasets(inp, tfms=[[None],[None],[None]], n_inp=1)
dsets 1) test_eq(dsets.n_inp,
# splits can be indices
= Datasets(range(5), tfms=[None], splits=[tensor([0,2]), [1,3,4]])
dsets
0), [(0,),(2,)])
test_eq(dsets.subset(0,),(2,)]) # Subset 0 is aliased to `train`
test_eq(dsets.train, [(1), [(1,),(3,),(4,)])
test_eq(dsets.subset(1,),(3,),(4,)]) # Subset 1 is aliased to `valid`
test_eq(dsets.valid, [(*dsets.valid[2], 4)
test_eq(#assert '[(1,),(3,),(4,)]' in str(dsets) and '[(0,),(2,)]' in str(dsets)
dsets
(#5) [(0,),(1,),(2,),(3,),(4,)]
# splits can be boolean masks (they don't have to cover all items, but must be disjoint)
= [[False,True,True,False,True], [True,False,False,False,False]]
splits = Datasets(range(5), tfms=[None], splits=splits)
dsets
1,),(2,),(4,)])
test_eq(dsets.train, [(0,)]) test_eq(dsets.valid, [(
# apply transforms to all items
= [[lambda x: x*2,lambda x: x+1]]
tfm = [[1,2],[0,3,4]]
splits = Datasets(range(5), tfm, splits=splits)
dsets 3,),(5,)])
test_eq(dsets.train,[(1,),(7,),(9,)])
test_eq(dsets.valid,[(False,True], [(5,)]) test_eq(dsets.train[
# only transform subset 1
class _Tfm(Transform):
=1
split_idxdef encodes(self, x): return x*2
def decodes(self, x): return TitledStr(x//2)
= Datasets(range(5), [_Tfm()], splits=[[1,2],[0,3,4]])
dsets 1,),(2,)])
test_eq(dsets.train,[(0,),(6,),(8,)])
test_eq(dsets.valid,[(False,True], [(2,)])
test_eq(dsets.train[ dsets
(#5) [(0,),(1,),(2,),(3,),(4,)]
#A context manager to change the split_idx and apply the validation transform on the training set
= dsets.train
ds with ds.set_split_idx(1):
2,),(4,)])
test_eq(ds,[(1,),(2,)]) test_eq(dsets.train,[(
= Datasets(range(5), [_Tfm(),noop], splits=[[1,2],[0,3,4]])
dsets 1,1),(2,2)])
test_eq(dsets.train,[(0,0),(6,3),(8,4)]) test_eq(dsets.valid,[(
= torch.arange(0,50)
start = Datasets(start, [A()])
tds = TfmdDL(tds, after_item=NegTfm(), bs=4)
tdl = tdl.one_batch()
b 0,),(1,),(2,),(3,)))
test_eq(tdl.decode_batch(b), (("0\n1\n2\n3") test_stdout(tdl.show_batch,
# only transform subset 1
class _Tfm(Transform):
=1
split_idxdef encodes(self, x): return x*2
= Datasets(range(8), [None], splits=[[1,2,5,7],[0,3,4,6]]) dsets
# only transform subset 1
class _Tfm(Transform):
=1
split_idxdef encodes(self, x): return x*2
= Datasets(range(8), [None], splits=[[1,2,5,7],[0,3,4,6]])
dsets = dsets.dataloaders(bs=4, after_batch=_Tfm(), shuffle=False, device=torch.device('cpu'))
dls 1,2,5, 7]),)])
test_eq(dls.train, [(tensor([0,6,8,12]),)])
test_eq(dls.valid, [(tensor([1) test_eq(dls.n_inp,
方法
= [1,2,3,4]
items = Datasets(items, [[neg_tfm,int2f_tfm]]) dsets
Datasets.dataloaders
Datasets.dataloaders (bs:int=64, shuffle_train:bool=None, shuffle:bool=True, val_shuffle:bool=False, n:int=None, path:str|Path='.', dl_type:TfmdDL=None, dl_kwargs:list=None, device:torch.device=None, drop_last:bool=None, val_bs:int=None, num_workers:int=None, verbose:bool=False, do_setup:bool=True, pin_memory=False, timeout=0, batch_size=None, indexed=None, persistent_workers=False, pin_memory_device='', wif=None, before_iter=None, after_item=None, before_batch=None, after_batch=None, after_iter=None, create_batches=None, create_item=None, create_batch=None, retain=None, get_idxs=None, sample=None, shuffle_fn=None, do_batch=None)
获取一个 DataLoaders
。
类型 | 默认值 | 详情 | |
---|---|---|---|
bs | int | 64 | 批次大小 |
shuffle_train | bool | None | (已弃用,请使用 shuffle )打乱训练集 DataLoader |
shuffle | bool | True | 打乱训练集 DataLoader |
val_shuffle | bool | False | 打乱验证集 DataLoader |
n | int | None | 用于创建 DataLoader 的 Datasets 大小。 |
path | str | Path | . | 放入 DataLoaders 的路径 |
dl_type | TfmdDL | None | DataLoader 的类型 |
dl_kwargs | list | None | 传递给每个 DataLoader 的 kwargs 列表 |
device | torch.device | None | 放置 DataLoaders 的设备 |
drop_last | bool | None | 丢弃最后一个不完整的批次,默认为 shuffle |
val_bs | int | None | 验证集批次大小,默认为 bs |
num_workers | int | None | 并行使用的 CPU 核数(默认:最多使用 16 个可用核) |
verbose | bool | False | 是否打印详细日志 |
do_setup | bool | True | 是否对批次变换运行 setup() |
pin_memory | bool | False | |
timeout | int | 0 | |
batch_size | NoneType | None | |
indexed | NoneType | None | |
persistent_workers | bool | False | |
pin_memory_device | str | ||
wif | NoneType | None | |
before_iter | NoneType | None | |
after_item | NoneType | None | |
before_batch | NoneType | None | |
after_batch | NoneType | None | |
after_iter | NoneType | None | |
create_batches | NoneType | None | |
create_item | NoneType | None | |
create_batch | NoneType | None | |
retain | NoneType | None | |
get_idxs | NoneType | None | |
sample | NoneType | None | |
shuffle_fn | NoneType | None | |
do_batch | NoneType | None | |
返回值 | DataLoaders |
用于创建 dataloaders。您可以像 val_shuffle
那样在前面加上 'val_' 来覆盖验证集的功能。如果需要处理多个 dataloader,dl_kwargs
可以提供更精细的每个 dataloader 控制。
Datasets.decode
Datasets.decode (o, full=True)
先组合所有 tuple_tfms
的 decode
,然后组合所有 tfms
的 decode
,应用于 i
*dsets[0], -1)
test_eq(*dsets.decode((-1,)), 1) test_eq(
Datasets.show
Datasets.show (o, ctx=None, **kwargs)
在 ctx
中显示项目 o
lambda:dsets.show(dsets[1]), '-2') test_stdout(
Datasets.new_empty
Datasets.new_empty ()
创建 self
的新空版本,仅保留变换
= [1,2,3,4]
items = Norm()
nrm = Datasets(items, [[neg_tfm,int2f_tfm], [neg_tfm]])
dsets = dsets.new_empty()
empty test_eq(empty.items, [])
添加测试集用于推理
# only transform subset 1
class _Tfm1(Transform):
=0
split_idxdef encodes(self, x): return x*3
= Datasets(range(8), [[_Tfm(),_Tfm1()]], splits=[[1,2,5,7],[0,3,4,6]])
dsets 3,),(6,),(15,),(21,)])
test_eq(dsets.train, [(0,),(6,),(8,),(12,)]) test_eq(dsets.valid, [(
test_set
test_set (dsets:__main__.Datasets|__main__.TfmdLists, test_items, rm_tfms=None, with_labels:bool=False)
使用 dsets
的验证集变换,从 test_items
创建一个测试集
类型 | 默认值 | 详情 | |
---|---|---|---|
dsets | main.Datasets | main.TfmdLists | 用于加载数据的 Map 风格或可迭代风格数据集 | |
test_items | 测试数据集中的项目 | ||
rm_tfms | NoneType | None | 要应用的 dsets 验证集中的 Transform 的起始索引 |
with_labels | bool | False | 测试项目是否包含标签 |
class _Tfm1(Transform):
=0
split_idxdef encodes(self, x): return x*3
= Datasets(range(8), [[_Tfm(),_Tfm1()]], splits=[[1,2,5,7],[0,3,4,6]])
dsets 3,),(6,),(15,),(21,)])
test_eq(dsets.train, [(0,),(6,),(8,),(12,)])
test_eq(dsets.valid, [(
#Tranform of the validation set are applied
= test_set(dsets, [1,2,3])
tst 2,),(4,),(6,)]) test_eq(tst, [(
DataLoaders.test_dl
DataLoaders.test_dl (test_items, rm_type_tfms=None, with_labels:bool=False, bs:int=64, shuffle:bool=False, num_workers:int=None, verbose:bool=False, do_setup:bool=True, pin_memory=False, timeout=0, batch_size=None, drop_last=False, indexed=None, n=None, device=None, persistent_workers=False, pin_memory_device='', wif=None, before_iter=None, after_item=None, before_batch=None, after_batch=None, after_iter=None, create_batches=None, create_item=None, create_batch=None, retain=None, get_idxs=None, sample=None, shuffle_fn=None, do_batch=None)
使用 dls
的验证集变换,从 test_items
创建一个测试 dataloader
类型 | 默认值 | 详情 | |
---|---|---|---|
test_items | 测试数据集中的项目 | ||
rm_type_tfms | NoneType | None | 要应用的 dsets 验证集中的 Transform 的起始索引 |
with_labels | bool | False | 测试项目是否包含标签 |
bs | int | 64 | 批次大小 |
shuffle | bool | False | 是否打乱数据 |
num_workers | int | None | 并行使用的 CPU 核数(默认:最多使用 16 个可用核) |
verbose | bool | False | 是否打印详细日志 |
do_setup | bool | True | 是否对批次变换运行 setup() |
pin_memory | bool | False | |
timeout | int | 0 | |
batch_size | NoneType | None | |
drop_last | bool | False | |
indexed | NoneType | None | |
n | NoneType | None | |
device | NoneType | None | |
persistent_workers | bool | False | |
pin_memory_device | str | ||
wif | NoneType | None | |
before_iter | NoneType | None | |
after_item | NoneType | None | |
before_batch | NoneType | None | |
after_batch | NoneType | None | |
after_iter | NoneType | None | |
create_batches | NoneType | None | |
create_item | NoneType | None | |
create_batch | NoneType | None | |
retain | NoneType | None | |
get_idxs | NoneType | None | |
sample | NoneType | None | |
shuffle_fn | NoneType | None | |
do_batch | NoneType | None |
= Datasets(range(8), [[_Tfm(),_Tfm1()]], splits=[[1,2,5,7],[0,3,4,6]])
dsets = dsets.dataloaders(bs=4, device=torch.device('cpu')) dls
= Datasets(range(8), [[_Tfm(),_Tfm1()]], splits=[[1,2,5,7],[0,3,4,6]])
dsets = dsets.dataloaders(bs=4, device=torch.device('cpu'))
dls = dls.test_dl([2,3,4,5])
tst_dl 1)
test_eq(tst_dl._n_inp, list(tst_dl), [(tensor([ 4, 6, 8, 10]),)])
test_eq(#Test you can change transforms
= dls.test_dl([2,3,4,5], after_item=add1)
tst_dl list(tst_dl), [(tensor([ 5, 7, 9, 11]),)]) test_eq(