错误1: 多Loss
RuntimeError: Trying to backward through the graph a second time, but the buffers have already been freed. Specify retain_graph=True when calling backward the first time.
原因:一次feed,多次backward()了。
方法:
把各个LOSS加权求和起来,然后再backward().
原来有问题的代码:
final_loss = (1-alpha ) * loss_func(predict_label,labels)
single_loss = alpha * loss_func(single_label,labels)
optimizer.zero_grad()
final_loss.backward()
single_loss.backward()
optimizer.step()
正确代码:
final_loss = (1-alpha ) * loss_func(predict_label,labels) + alpha * loss_func(single_label,labels)
optimizer.zero_grad()
final_loss.backward()
optimizer.step()
错误2:Expected object of scalar type Long but got scalar type Float for argument
交叉熵的label必须要转换为Long类型。
解决方法:
labels.to(dtype=tensor.long)
错误3:RuntimeError: 1D target tensor expected, multi-target not supporte
解决方法:交叉熵的Label的shape必须为(样本个数,)
错误4: 与keras相同的模型,pytorch的模型准确率会比keras低很多个百分点
首先检查在Keras和pytorch实现的两个模型是否一致,比如各层的参数个数是不是一致,那些默认使用的初始化方法、激活函数是否是一致。
其次,检查pytorch的模型在训练过程,数据集是否随机化打乱过顺序。Keras实现的模型 在fit的时候会默认对训练数据和验证数据做一次shuffle。如果输入给pytorch的训练数据没有shuffle,那么模型很有可能只记住了最后一个batch的数据的特征,这会严重带偏模型的泛化性。