我目前正在训练一个 3D CNN,用于具有相对稀疏标签的二元分类(标签数据中约 1% 的体素对应于目标类)。
为了在训练期间执行基本的健全性检查(例如,网络是否完全学习?),向网络展示一个小的、精心挑选的训练示例子集,其目标类别标签的比例高于平均水平。
正如 Pytorch 文档所建议的那样,我实现了自己的dataset类(继承自torch.utils.data.Dataset),它通过它的__get_item__方法向torch.utils.data.DataLoader.
在我发现的pytorch 教程中,DataLoader用作迭代器来生成训练循环,如下所示:
for i, data in enumerate(self.dataloader):
# Get training data
inputs, labels = data
# Train the network
# [...]
Run Code Online (Sandbox Code Playgroud)
我现在想知道的是是否存在一种简单的方法来加载单个或几个特定的训练示例(使用Dataset's__get_item__方法理解的线性索引)。但是,DataLoader没有__get_item__方法并反复调用__next__直到达到所需的索引似乎并不优雅。
显然,解决此问题的一种可能方法是定义自定义sampler或batch_sampler从抽象继承torch.utils.data.Sampler。但这似乎超出了检索一些特定样本的要求。
我想我在这里忽略了一些非常简单和明显的东西。任何建议表示赞赏!
我正在尝试在这里实现非常简单的功能,以一种优雅的方式可以实现,但我不知道如何:
假设我有一个列表my_list = [1, None, 3, 4],想要val = 3向每个数字元素添加一个常量以获得my_list + val = [4, None, 6, 7]:
可以使用带有None值条件的有点笨重的循环来完成此操作:
my_list = [1, None, 3, 4]
val = 3
for idx, el in enumerate(my_list):
if el is not None:
my_list[idx] += val
print(my_list)
>>> [4, None, 6, 7]
Run Code Online (Sandbox Code Playgroud)
但是,我强烈认为必须有一种更优雅的方法。我尝试了以下方法:
my_list = list(map(lambda x: x+val, filter(None, my_list)))
print(my_list)
>>> [4, 6, 7]
Run Code Online (Sandbox Code Playgroud)
但是后来这些None元素消失了,我需要保留它们。
任何想法表示赞赏!