解决方案:模型中断后继续训练出错效果直降、自动生成requirements.txt、‘scipy.misc‘ has no attribute ‘imread‘

2024-05-07 10:07:53 浏览数 (1)

问题1:模型中断后继续训练出错

在有些时候我们需要保存训练好的参数为path文件,以防不测,下次可以直接加载该轮epoch的参数接着训练,但是在重新加载时发现类似报错:

代码语言:powershell复制
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的参数接着训练,继续训练的过程是能够运行的,但是发现继续训练时效果大打折扣,完全没有中断前的最后几轮好。

问题原因:暂时未知,推测是续训时模型加载的问题,也有可能是保存和加载的方式问题

解决方案:统一保存和加载的方式,当我采用以下方式时,貌似避免了这个问题:

模型的保存:

代码语言:python代码运行次数:0复制
torch.save(netG.state_dict(), 'models/%s/netG_d.pth' % (cfg.CONFIG_NAME, epoch))

模型的重新加载:

代码语言:python代码运行次数:0复制
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.misc 模块是一个被弃用的模块,其中的一些函数已经在较新的版本中被移除或迁移到其他模块中。imread 是其中一个已被移除的函数。

如果你想读取图像文件,可以使用其他替代的库和函数,如 PIL(Python Imaging Library),imageio 或 opencv 等。这些库提供了更好的图像处理和读取功能。

解决方案1:降低scipy的版本(不推荐)

pip install scipy==1.2.1

解决方案2:使用imageio.imread来代替,在使用到imread加入如下代码:

import imageio content_image = imageio.imread问题5:No module named 'tensorflow.compat'

问题原因:compat是TensorFlow的2.x里的模块,Tensorflow1.x版本里是没有的。(虽然)

解决方案:先卸载原版本Tensorflow:pip uninstall tensorflow

再重新安装Tensorflow就行了:pip install tensorflow

问题6:EOFError: Ran out of input

问题原因:使用pickle.load(f)加载pickle文件时,文件为空

这个错误 "EOFError: Ran out of input" 表示代码在读取输入时已经到达了文件的结尾,即没有更多的输入可供读取。

这个错误可能出现在以下情况下:

  1. 读取文件时,已经到达了文件的结尾,但代码尝试继续读取更多内容。
  2. 确保你的代码在读取文件内容之前使用了适当的文件打开和关闭操作。如果你正在使用 open() 函数来读取文件,请确保你按照正确的方式打开和关闭文件,避免超过文件的总字节数量。
  3. 读取数据流时,已经没有更多的输入可供读取。确保你的代码在读取数据流(如标准输入、socket 连接等)时,已经正确处理了可能的结束条件,并及时退出读取循环。

解决方案:找到加载pickle文件的代码位置,检查文件内容和路径

我正在参与2024腾讯技术创作特训营最新征文,快来和我瓜分大奖!

0 人点赞