问题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上升⬆,说明网络结构设计不当,训练超参数设置不当,数据集经过清洗等问题。