深度学习和日常代码中遇到的报错以及解决方法汇总(一)

问题1:RuntimeError: Given groups=1, weight of size [4, 23, 1, 3], expected input[32, 1, 23, 1024] to have 23 channels, but got 1 channels instead

解决方法:这个错误经常出现在卷积操作中,卷积核为[4, 23, 1, 3],有23个通道,但是输入的数据是[32, 1, 23, 1024],它只有1个通道,从而导致无法执行卷积操作。

这时候需要修改卷积核或者输入数据的维度就可以了,例如x = x.permute(0, 2, 1, 3),将输入数据修改成[32, 23, 1, 1024]。

补充:(1)TensorFlow使用"NHWC"(批次、高度、宽度、通道)格式,而PyTorch使用"NCHW"(批次、通道、高度、宽度)格式

(2)nn.Conv2d”需要输入的张量格式为(batch_size,channels,height,width)。

问题2:RuntimeError: Sizes of tensors must match except in dimension 3. Got 32 and 256 (The offending index is 0)或者RuntimeError: Sizes of tensors must match except in dimension 3. Got 1024 and 1000 (The offending index is 0)

解决方法:当一个模块的输出和下一模块的输入不一致时,就会出现以上错误。查找代码发现tmp_aug_data = np.zeros((int(self.batch_size / 2), 1, 22, 1024)),将第四维度的1024修改成1000即可。

问题3:could not broadcast input array from shape (1,22,125) into shape (1,23,125)

解决方法:无法将形状(1,22,125)的输入数组广播到形状(1,23,125),将tmp_aug_data = np.zeros((int(self.batch_size / 2), 1, 23, 1024))中的23修改成22即可。

问题4:UserWarning: Using a target size (torch.Size([64])) that is different to the input size (torch.Size([64,1]))

解决方法:在forward(self, x)函数体中,在return x之前,加一句 x = x.squeeze(-1)

问题5: Found dtype Long but expected Float

解决方法:即发现dtype是Long,但是期待的是Float。loss = torch.tensor(loss, dtype=float)或者loss = criterion(outputs.float(), labels.float())即可。

问题6:一个四分类模型修改成二分类模型为什么模型训练不了了?训练集和测试集的损失在0.69左右震荡,准确率在0.5左右。如何调参? 

模型训练不了,并且训练和测试的loss一直在0.69左右,并且准确率在0.5左右。最终发现是自己写了with torch.no_grad():导致梯度无法回传。。。

#通过模型前向传播得到预测结果outputs
with torch.no_grad():              #在该上下文中禁用梯度计算
    tok, outputs = self.model(img)
#print(label)
loss = self.criterion_cls(outputs, label) #计算损失
loss = loss.requires_grad_(True)   #这行很重要!!!!
self.optimizer.zero_grad()  #清除之前的梯度,计算新的梯度并执行优化步骤
loss.backward()
self.optimizer.step()

 最后,去掉with torch.no_grad():就好了

tok, outputs = self.model(img)
loss = self.criterion_cls(outputs, label) 
self.optimizer.zero_grad()
loss.backward()
self.optimizer.step()

 训练和测试结果,但是过拟合了,下一个问题回答如何解决过拟合。

Epoch: 154   Train loss: 0.512898   Test loss: 1.027601   Train accuracy 0.833333   Test accuracy is 0.812500
Epoch: 155   Train loss: 0.212264   Test loss: 0.571114   Train accuracy 0.916667   Test accuracy is 0.840278
Epoch: 156   Train loss: 0.227078   Test loss: 0.980313   Train accuracy 0.916667   Test accuracy is 0.805556
Epoch: 157   Train loss: 0.074862   Test loss: 0.553649   Train accuracy 1.000000   Test accuracy is 0.868056
Epoch: 158   Train loss: 0.254584   Test loss: 0.898941   Train accuracy 0.916667   Test accuracy is 0.812500
Epoch: 159   Train loss: 0.150621   Test loss: 0.649912   Train accuracy 0.937500   Test accuracy is 0.840278
Epoch: 160   Train loss: 0.081932   Test loss: 0.845983   Train accuracy 0.979167   Test accuracy is 0.819444
Epoch: 161   Train loss: 0.150147   Test loss: 0.675670   Train accuracy 0.958333   Test accuracy is 0.840278
Epoch: 162   Train loss: 0.119278   Test loss: 0.992911   Train accuracy 0.937500   Test accuracy is 0.805556
Epoch: 163   Train loss: 0.197456   Test loss: 0.666107   Train accuracy 0.895833   Test accuracy is 0.847222
Epoch: 164   Train loss: 0.215821   Test loss: 0.761508   Train accuracy 0.875000   Test accuracy is 0.840278
Epoch: 165   Train loss: 0.187882   Test loss: 0.747972   Train accuracy 0.937500   Test accuracy is 0.826389
Epoch: 166   Train loss: 0.171682   Test loss: 0.789932   Train accuracy 0.916667   Test accuracy is 0.826389
Epoch: 167   Train loss: 0.225760   Test loss: 0.668289   Train accuracy 0.875000   Test accuracy is 0.840278
Epoch: 168   Train loss: 0.237878   Test loss: 0.725366   Train accuracy 0.875000   Test accuracy is 0.847222
Epoch: 169   Train loss: 0.138423   Test loss: 0.739690   Train accuracy 0.979167   Test accuracy is 0.819444
Epoch: 170   Train loss: 0.132995   Test loss: 0.715564   Train accuracy 0.958333   Test accuracy is 0.840278
Epoch: 171   Train loss: 0.108107   Test loss: 0.639324   Train accuracy 0.958333   Test accuracy is 0.854167
Epoch: 172   Train loss: 0.211976   Test loss: 0.970230   Train accuracy 0.916667   Test accuracy is 0.826389
Epoch: 173   Train loss: 0.125841   Test loss: 0.789686   Train accuracy 1.000000   Test accuracy is 0.826389

 对于二分类问题,损失函数一般用的是binary_crossentropy,要注意loss=0.693...是一个特殊值,因为二分类问题随便猜测的概率就为0.5,用交叉熵进行计算:loss=-ln(0.5)。

解决的办法:

1、在每个卷积层与激活函数层之间都加了一个BatchNorm2d;将数据归一化后,网络可以迅速收敛;

2、修改学习率;

3、修改优化器,例如Adam/SGD;

4、查看是否打乱数据,放置每次batch都是一个类别会造成无法优化;

5、查看数据是否标准化;

6、查看数据标签是否有误;

7、检查网络是不是没有回传梯度,而只是做了前向运算;

8、检查参数有没有初始化;

9、检查第一层的卷积输出是否正常,是不是全是0;

10、检查是否在logit那层加了激活函数,导致logits有问题,例如全是0,经过softmax后就是0.5了

问题7:神经网络 train_loss 不断下降,但是 test_loss 不断上升的原因是什么?

出现这个问题,是由于模型过拟合了,解决方法可参考这篇博客:

• train loss 下降⬇,val loss下降⬇,说明网络仍在学习;奈斯,继续训练
• train loss 下降⬇,val loss上升⬆,说明网络开始过拟合了; 赶紧停止,然后数据增强、正则、Dropout。
• train loss 不变,val loss不变,说明学习遇到瓶颈;调小学习率或批量数目
• train loss 不变,val loss下降⬇,说明数据集100%有问题;检查数据集标注有没有问题
• train loss 上升⬆,val loss上升⬆,说明网络结构设计不当,训练超参数设置不当,数据集经过清洗等问题。

深度学习模型训练的一些小技巧(过拟合如何处理,超参数的选取)_过拟合怎么调整超参数-CSDN博客文章浏览阅读1.1k次,点赞5次,收藏12次。全是干货,在学习深度学校中遇到的一些问题和处理办法_过拟合怎么调整超参数https://blog.csdn.net/m0_63669388/article/details/131164044

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值