pytorch 踩坑集

错误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的数据的特征,这会严重带偏模型的泛化性。

猜你喜欢

转载自blog.csdn.net/jmh1996/article/details/109680848