持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第10天,点击查看活动详情
解决方案:炼丹师养成计划 Pytorch+DeepLearning遇见的各种报错与踩坑避坑记录
问题1:模型中断后继续训练出错
在有些时候我们需要保存训练好的参数为path文件,以防不测,下次可以直接加载该轮epoch的参数接着训练,但是在重新加载时发现类似报错:
size mismatch for block0.affine0.linear1.linear2.weight: copying a param with shape torch.Size([512, 256]) from checkpoint, the shape in current model is torch.Size([256, 256]).
size mismatch for block0.affine0.linear1.linear2.bias: copying a param with shape torch.Size([512]) from checkpoint, the shape in current model is torch.Size([256]).
问题原因:这是说明某个超参数出现了问题,可能你之前训练时候用的是64,现在准备在另外的机器上面续训的时候某个超参数设置的是32,导致了size mismatch
解决方案:查看size mismatch的模型部分,将超参数改回来。
问题2:模型中断后继续训练 效果直降
加载该轮epoch的参数接着训练,继续训练的过程是能够运行的,但是发现继续训练时效果大打折扣,完全没有中断前的最后几轮好。 问题原因:暂时未知,推测是续训时模型加载的问题,也有可能是保存和加载的方式问题 解决方案:统一保存和加载的方式,当我采用以下方式时,貌似避免了这个问题: 模型的保存:
torch.save(netG.state_dict(), 'models/%s/netG_%03d.pth' % (cfg.CONFIG_NAME, epoch))
模型的重新加载:
netD.load_state_dict(torch.load('models/%s/netD_300.pth' % (cfg.CONFIG_NAME), map_location='cuda:0'))
问题3:如何自动生成requirements.txt,如何根据requirements安装环境
解决方案1(推荐):使用Python打开自己的工程,然后点击工具(Tools)———同步Python要求(Sync Python Requirements)
然后需求版本改为兼容(~=x.y.z),然后点击确定就可以自动生成requirements.txt了
根据requirements.txt自动安装对应环境:
pip install -r requirements.txt
问题4:AttributeError: module 'scipy.misc' has no attribute 'imread'
SciPy 是一个开源的 Python 算法库和数学工具包。Scipy 是基于 Numpy 的科学计算库,用于数学、科学、工程学等领域,很多有一些高阶抽象和物理模型需要使用 Scipy。
问题原因:scipy在1.2后的版本已经抛弃使用imread 解决方案1:降低scipy的版本(不推荐)
pip install scipy==1.2.1
解决方案2:使用imageio.imread来代替,在使用到imread加入如下代码:
import imageio content_image = imageio.imread
问题5:No module named 'tensorflow.compat'
v1版本中tensorflow中contrib模块十分丰富,但是发展不可控,因此在v2版本中将这个模块集成到其他模块中去了。在学习tensorflow经常碰到tf.contrib的代码,一敲就报错。
问题原因:compat是TensorFlow的2.x里的模块,Tensorflow1.x版本里是没有的。(虽然)
解决方案:先卸载原版本Tensorflow:pip uninstall tensorflow
再重新安装Tensorflow就行了:pip install tensorflow,别忘了把原来的import tensorflow as tf删了
问题6:EOFError: Ran out of input
问题原因:使用pickle.load(f)加载pickle文件时,文件为空
解决方案:找到加载pickle文件的代码位置,检查文件内容和路径
python的pickle模块提供了一个简答的持久化功能,可以将对象以文件的形式存放在磁盘上。 pickle模块实现了基本的数据序列化和反序列化
通过pickle模块的序列化操作pickle.dump(obj, file, [,protocol]),我们能够将程序中运行的对象信息保存到文件中去,永久存储。
通过pickle模块的反序列化操作pickle.load(file),我们能从文件中创建上一次程序保存的对象