我又来了=.=

有点不幸,今天又遇到困难了,不过幸运的是解决了

问题描述

先上代码

# 根据图片目录创建数据集
ds_train = datasets.ImageFolder("./data/cifar2/train",
                               transform=transform_train,
                               target_transform=lambda t:torch.tensor([t]).float())
ds_valid = datasets.ImageFolder("./data/cifar2/test",
                               transform=transform_train,
                               target_transform=lambda t:torch.tensor([t]).float())
print(ds_train.class_to_idx)

从上面的代码可以看出ImageFolder函数的target_transform参数使用lambda表达式写的,但是应该是版本问题,我的pytorch版本是12,所以运行这个的时候就报错,如下:

PicklingError: Can't pickle <function <lambda> at 0x000002A5B55618C8>: attribute lookup <lambda> on __main__ failed

解决办法

其实很简单,但是我一直没想到,这个是这个参数不接受lambda表达式,那可以直接传函数进去就行了。
代码如下:

def transformTarget(t):
    return torch.tensor([t]).float()
# 根据图片目录创建数据集
ds_train = datasets.ImageFolder("./data/cifar2/train",
                               transform=transform_train,
                               target_transform=transformTarget)
ds_valid = datasets.ImageFolder("./data/cifar2/test",
                               transform=transform_train,
                               target_transform=transformTarget)

print(ds_train.class_to_idx)

问题2:

其实也不是问题啦,是个bug,同样先上代码

# 使用DataLoader加载数据集
dl_train = DataLoader(ds_train, batch_size=50, shuffle=True, num_workers=2)
dl_valid = DataLoader(ds_valid, batch_size=50, shuffle=True, num_workers=2)

我使用的win10的环境,DataLoader使用多线程的时候就会如下

BrokenPipeError: [Errno 32] Broken pipe

看了一些博客之后说这是个bug,具体可以看这个链接

我的解决办法就是直接不用多线程了,毕竟我还只是处于初学者,希望以后能用一下吧(Ubuntu我会来的!!!

吃饭去了,溜了溜了...

posted @ 2020-09-29 18:08  Samll_unicorn  阅读(207)  评论(0编辑  收藏  举报