【转载】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

这个问题可能有两个原因

  1. 你用conda装了一个numpy,又用pip装了一个numpy。导致冲突,你卸载一个就行了;比如:
conda uninstall numpy
  1. 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

解决上面的问题