【转载】pytorch里面的天坑
2021年11月13日,补充一个深坑,这个坑引发的bug导致我查了一整天
Dataset里面的随机值
※※※ 涉及到需要给每批次数据加随机值时,需要着重关注此点:
据说在新版本pytorch已经解决这个问题,我没有测试,仅说一下1.6版本的问题及解决方法
一日捉虫,偶然发现我写在dataset里面__getitem__
的随机值并没有根据每次迭代而变化。经过查阅,在https://zhuanlan.zhihu.com/p/377155682以及https://github.com/pytorch/pytorch/pull/56488#issuecomment-825128350已经有了相关讨论,解决方法很简单
首先在dataloader里面加点东西,最后的那个worker_init_fn
train_dataloader = DataLoader(dataset=train_dataset,
batch_size=1,
shuffle=True,
num_workers=8,
drop_last=False,
worker_init_fn=worker_init_fn)
然后把下面这段粘贴到dataloader前面
def worker_init_fn(worker_id):
worker_seed = torch.initial_seed() % 2**32
np.random.seed(worker_seed)
random.seed(worker_seed)
这样每次迭代取数据时,随机数就会不同。
今天随便炼丹取暖,结果卡了一个坑,在网上找到一个解决方案,顺便把其他的部分也粘贴过来存个档吧
作者:八戒
链接:https://zhuanlan.zhihu.com/p/95883048
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
Pytorch 数据读取模块windows和linux不同
报错如下:
AttributeError: Can't pickle local object 'get_loader.<locals>.<lambda>'
问题如上所示,但是Google全是这种,或者这种。它还有一个报错是
EOFError: Ran out of input
又或者这种。无解啊,报错的是数据读取模块,但是我的程序在Linux系统下是没有问题的,但是到了Windows系统下就有问题了,不知道为什么。
data.DataLoader(dataset=dataset, batch_size=1, shuffle=False, num_workers=num_thread)
就是把num_workers指定为0,或者直接不写。
Pytorch GPU问题
Pytorch在GPU并行方面还算很方便。在定义好model之后只需要使用一行:
model = torch.nn.DataParallel(model)
#默认调用所有GPU
即可实现在所有GPU上并行运算。
但是有时候直接占用所有的GPU是没有必要的,如果要指定GPU,可以在DataParallel中增加一个参数:
model = torch.nn.DataParallel(model, device_ids=[0,1])
在运行时会报出如下错误:
RuntimeError: all tensors must be on devices[0]
该错误的解决方式有很多,这里推荐使用一种最简单的,在运行代码的时候,调整程序可见的GPU即可,具体而言就是将原先的运行指令:
python train.py
改为
CUDA_VISIBLE_DEVICES=2,3 python train.py
而程序中还是写为:
model = torch.nn.DataParallel(model, device_ids=[0,1])
Pytorch 权重和数据不对
报错如下:
Input type (CUDAFloatTensor) and weight type (FloatTensor) should be the same
仔细看错误信息,CUDA和CPU,输入数据x和模型中的权重值类型不一样,一般来说是因为模型的参数不在GPU中,而输入数据在GPU中,通过添加model.cuda()将模型转移到GPU上以解决这个问题。但是我的模型中已经有model.cuda了。
问题在模型中,不能把卷积定义到forward中,像下面这样是不行的
def forward(self, x):
fin_x = nn.Conv2d(128,1,1,1)(x)
这就会导致这个问题,必须把
fin_x = nn.Conv2d(128,1,1,1)(x)
这个定义到上面的模型中
Pytorch cpu加载多GPU训练模型
多GPU训练保存的模型会多一个module
Missing key(s) in state_dict: "layer1.0.0.weight", "layer1.0.2.weight",
Unexpected key(s) in state_dict: "module.layer1.0.0.weight",
怎么解决呢?
state_dict = torch.load(model_path,map_location='cpu')
from collections import OrderedDict
new_state_dict = OrderedDict()
for k, v in state_dict.items():
name = k[7:] # remove module.
new_state_dict[name] = v
net.load_state_dict(new_state_dict)
torchvision中datasets加载CIFAR10,CIFAR100问题
因为网络的问题,自己就提前下载了数据集,但是网络一加载就报错,找不到数据,我就奇了怪了。。。。明明有就是找不到
train_set = datasets.CIFAR10(data, train=True, transform=train_transforms, download=False)
test_set = datasets.CIFAR10(data, train=False, transform=test_transforms, download=False)
报错如下:
RuntimeError: Dataset not found or corrupted. You can use download=True to download it
几经折腾才发现问题在那,自己提前下载了,**参数要给全。。。**路径给全,也就是绝对路径
train_set = datasets.CIFAR10(root=data, train=True, transform=train_transforms, download=False)
test_set = datasets.CIFAR10(root=data, train=False, transform=test_transforms, download=False)
Pytorch中cudnn错误
RuntimeError: cuDNN error: CUDNN_STATUS_NOT_SUPPORTED. This error may appear if you passed in a non-contiguous input.
看官方说法是矩阵太大了,然后把批量换小点,我换小了也不行,只有换到1才行。。。。
还有就是禁用cudnn的加速
torch.backends.cudnn.enabled = False
这个方法是可行的,但是慢的一批
Pycharm 数据显示不全
在Anaconda中notebook可以显示全部的数据,但是在pycharm中,使用print(dataframe),不能显示dataframe的全部数据,中间的数据用省略号表示。
在pycharm中显示全部数据解决方法,输入下面代码:
import pandas as pd
#显示所有列
pd.set_option('display.max_columns', None)
#显示所有行
pd.set_options('display.max_rows', None)
类似的,对于numpy array print后不能完全显示输入下面代码:
numpy.set_printoptions(threshold = np.inf)
#若想不以科学计数显示:
numpy.set_printoptions(suppress = True)
numpy问题
报错如下:
in numpy.import_array
ImportError: numpy.core.multiarray failed to import
这个问题可能有两个原因
- 你用conda装了一个numpy,又用pip装了一个numpy。导致冲突,你卸载一个就行了;比如:
conda uninstall numpy
- numpy 版本太低,导致不兼容,更新一下
pip install -U numpy
conda update numpy
pip问题
装sklean的时候发现如下错误
ERROR: Could not find a version that satisfies the requirement threadpoolctl>=2.0.0 (from scikit-learn->sklearn) (from versions: 1.0.0, 1.1.0)
ERROR: No matching distribution found for threadpoolctl>=2.0.0 (from scikit-learn->sklearn)
然后上网找了下解决方案,更新pip
python -m pip install --upgrade pip
然后 然后 然后就悲剧了!!!我的pip就崩了
Script file 'D:\Anaconda3\Scripts\pip-script.py' is not present
大家更新的时候一定要在管理员的情况下更新你的pip
然后管理员运行
easy_install pip
解决上面的问题