我编辑代码时的问题和解决方案

list indices must be integers or slices, not tuple

列表索引必须是整数或切片,而不是元组

‘range’ object is not callable

‘xxx’ object is not callable,“xxx”为函数,例如int,list,str。
当出现报错 ‘xxx’ is not callable的时候,通常都是函数名重用或者变量名重用。

CUDNN_STATUS_BAD_PARAM

E:\conda\envs\yuwang\python.exe E:/ZHM/ISTA-Net-PyTorch-master/Train_Test_2_16_block1_4_msr3_f.py
RuntimeError: cuDNN error: CUDNN_STATUS_BAD_PARAM

loss: nan

[ 1/300] train_loss: 0.00715 valid_loss: nan
Validation loss decreased (inf --> nan). Saving model …
遇到了loss是nan的情况
出现nan的情况还有以下几种:
学习率太大,但是样本数据集又很小。(我的情况)
自定义的loss除以了一个很小的数字,小到接近0。
数据不干净,数据本身就有nan,可以用numpy.isnan检查。
target,即label是大于等于0的。从1到类别数目-1变化。

我把验证集从val100改为了set11,学习率从0.01改到了0.001,这样了,CUDNN_STATUS_BAD_PARAM和损失nan的报错就都不出现了

在调试代码的过程中,也出现了train loss nan的情况。后来,我把训练数据从800增到80000,就不出现nan了。

还有一种情况,我忘记把这句话加到训练过程中了。

 train_losses.append(loss_all.item())  # 每个batch里面的损失

因为设置了train_losses=[],因此train_losses一直是[]的状态。

加上后,就不出现nan了。
**

ReLU函数有个inplace参数

ReLU函数有个inplace参数,如果设为True,它会把输出直接覆盖到输人中.这样可以节省内存显存。之所以可以覆盖是因为在计算ReLU的反向传播时,只需根据输出就能够推算出反向传播的梯度。但是只有少数的autograd操作支持inplace操作(如varable sigmoid0).除非你明确地知道自己在做什么,否则一般不要使用inplace 操作。在以上例子中。都是将每一 层的输出直接作为下一层的输人,这种网络称为前馈传播网络(Feedforward Neural Network )。对于此类网络, 如果每次都写复杂的forward函数会有些麻烦,在此就有两种简化方式,ModuleList和Sequential。其中Sequential是一个特殊的Module,前向传播时会将输入一层接一层地传递下去。ModuleList 也是个特殊的Module,它包含几个子Module,可以像用list一样使用它,但不能直接把输入传入给ModuleList。
–《深度学习框架pytorch入门与实践》112页

关于使用GPU的一些建议:

. GPU运算很快,但运算量小时,并不能体现出它的优势,因此一些简单的操作可直接利用CPU完成。
.数据在CPU和GPU之间的传递会比较耗时,应当尽量避免。
.在进行低精度的计算时,可以考虑HalfTensor,相比FloatTensor能节省一半的显存,但需千万注意数值溢出的情况。
注意:大部分的损失函数也都属于nn . Module,但在使用GPU时,很多时候我们都忘记使用它的. cuda方法,在大多数情况下不会报错,因为损失函数本身没有可学习的参数( leamable parameters )。但在某些情况下会出现问题,为了保险起见同时也为了代码更规范,应记得调用criterion .cuda.
–《深度学习框架pytorch入门与实践》160页

Py Torch调用CuDNN报错时,报错信息诸如CUDNN STATUS_ BAD PARAM, 从这些报借内容很难得到有用的帮助信息,最好先利用CPU运行代码,此时一般会得到相对友好的报错信息,例如在ipdb中执行model . cpu() (input . cpu()),PyTorch底层的TH库会给出相对比较详细的信息。

常见的错误主要有以下几种:

●类型不匹配问题。例如CrossEntropyLoss的输入target 应该是一个LongTensor .而很多人输入FloatTensor。

●部分数据忘记从CPU转移到GPU。例如,当model存放于GPU时,输入input也需要转移到GPU才能输入到model中。还有可能就是把多个module存放于一个list对象,而在执行model . cuda ()时,这个list中的对象是不会被转移到CUDA 上的,正确的用法是用ModuleList代替。

●Tensor形状不匹配。此类问题一般是输入数据形状不对,或是网络结构设计有题,一般通过u§跳到指定代码,查看输人和模型参数的形状即可得知。

此外,可能还会经常遇到程序正常运行、没有报错,但是模型无法收敛的问题。如对于二分类问题,交叉熵损失一直徘徊在0.69附近( \n2),或者是数值出现溢出可题,此时可以进人debug模式,用单步执行看看每一层输出的均值和方差,观察从哪一层的输出开始出现数值异常。还要查看每个参数梯度的均值和方差,看看是否梯度消失或者梯度爆炸等问题。一般来说,通过在激活函数之前增加BatchNorm层,合理的参数初始化、使用Adam优化器、学习率设为0.001,基本就能确保模型在一定程度收敛。
–《深度学习框架pytorch入门与实践》197页

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值