train的位置
今天把epoch改成step训练结果奇怪的发生了
然后准确率也超级低
查问题说是学习率过大或者数据有问题,导致梯度消失或者梯度爆炸,检查数据集或者不断调低学习率。
但是对于我来说是跑过的一样的数据集一样的读取和预处理,另外学习率已经够低了,说学习率调到0 错误消失说明就不是数据集的问题,我这样做了,但是精度一样如上的低,虽然Test loss 有数值了。
看代码也没问题,结果,果然是很细小的错误,
net.train()的用法位置!!!!!
先看epoch训练的net.train()位置
def train(total_step, net, optimizer, train_loader, criterion):
net.train() # 这时候大部分代码都放这儿的
for _,data in enumerate(train_loader): # 以为把这里变成step放进总训练就好
label = data.y
if torch.cuda.is_available():
data = data.to(device)
label = label.to(device)
# 前向传播计算损失
out = net(data).squeeze()
loss = criterion(out, label)
!!!重点就是net.train()的位置,(很多博客都说放在训练前的,以前epoch训练没问题,换step时粗心没有注意到,这样放的
while total_step < args.need_step:
# net.train() # 不应该放在这里了
for step, data in enumerate(train_loader):
net.train() # 放这里了
label = data.y
if torch.cuda.is_available():
data = data.to(device)
label = label.to(device)
# 前向传播计算损失
out = net(data).squeeze()
# 算损失
loss = criterion(out, label)
......
然后就正常了
优化器
2022.12.6晚更
调GIN调到脑壳大,各种参数层次都改了,而且本地没有数据,服务器上又不好调试,只有print来看,调了十多种可能,在明天即将组会的我还没跑出来。在这个差几分钟12点的夜晚,突然灵光一闪,好像以前有loss=nan的情况,除了写的这篇博客net.train的位置,还有就是优化器!!!没错,原始数据是Adam,后面导师让改成了SGD,SGD在GraphSage,GatedGCN都没问题,(那是在跑哪个GCN出现的这俩优化器换了会loss=nan),记不清了,反正灵光一闪是有这个印象,
果然,把SGD换成Adam
几个epoch后
好了,可算是结束了。。