2021.12.7的记录
照着书把代码打了一遍
训练了10个epoch,可以说是没有啥下降的趋势。有问题。
2021.12.8的记录
检查了很多遍代码之后,发现代码部分有编写错误,输入输出通道数一点要算对。确定代码没有问题后训练,但是为什么它的损失一直是同一个值。我将学习率减小了一百倍,发现损失是在一直减小的。但其实验证精确率已经达到了100%。
个人推断可能是由于网络性能,训练效果只能这样了。由于图片也不是很多,再加上是用的预训练好的特征提取层,用之前的学习率训练一轮直接就达到了局部最小值。
一些代码和函数的理解
nn.CrossEntropyLoss()
这个函数算的是一个step里batch_size张图片的平均损失。
训练部分代码:
Myvggc.train()
for step, (b_x, b_y) in enumerate(train_data_loader):
b_x = b_x.to(device)
b_y = b_y.to(device)
output = Myvggc(b_x)
loss = loss_func(output, b_y)
print(loss.data)
pre_lab = torch.argmax(output, 1)
optimizer.zero_grad()
loss.backward()
optimizer.step()
train_loss_epoch += loss.item() * b_x.size(0)
train_corrects += torch.sum(pre_lab == b_y.data)
train_loss = train_loss_epoch / len(train_data.targets)
train_acc = train_corrects.double() / len(train_data.targets)
print("train_loss=%f,train_acc=%f" % (train_loss, train_acc))
也就是这里的 loss为什么要乘以batch_size的原因,然后再相加得到一个epoch的总损失(train_loss_epoch),但最后又除了训练样本数,也就是最后得到的损失(train_loss )是每一张图像的平均损失。
然后这里的训练集精度就跟吴恩达老师机器学习里教的一样。先将预测到的结果与label对比,算有多少个1(也就是有多少预测对了)然后除以label总个数,就得到了精准度了。
然后画图部分的代码
image = b_x[ii, :, :, :].numpy().transpose((1, 2, 0))
image = std * image + mean
# np.clip(a,a_min,a_max,out=none)该函数的作用是将数组a中的所有数限定到范围a_min和a_max中
image = np.clip(image, 0, 1)
plt.imshow(image)
.transpose((1, 2, 0)) 目的是将image的维度变换。原本image经过处理之后的维度是(channel,h,w)经过transpose后变成了(h,w,channel)。为什么要变呢?因为plt.imshow()要求输入的格式是(h,w,channel)