不知道是自己不太懂得搜索还是知识积累的太少,遇到很多问题都不能很好的解决。
而且网上的一些解决办法也真的是bull shit。。。。。
- 关于变量类型不一致的问题
RuntimeError: Function AddBackward0 returned an invalid gradient at index 1 - expected type torch.FloatTensor but got torch.cuda.FloatTensor
这个错误的意思就是 网络的输入和模型中的参数类型不一致,一个是在gpu上的,即cuda.floatTensor, 一个是在cpu上的,即FloatTensor。
网上有各种各样的解答,但最重要的核心问题是:你在初始化模型和输入是有没有加上to(service)。
示例代码如下:
self.FlowNet = self.FlowNet.to(self.device) # 模型转gpu
self.real_A_1 = input_A[0].to(self.device) # 输入转gpu
2. 关于模型训练过程中服务器总是挂掉的解决方案
我真的要吐槽一下太过于冷漠的师兄!哼╭(╯^╰)╮ 问他怎么回事直接告诉我小窗运行, 让我以为是我一直看着他运行的原因,呜呜呜,气得我今天早上差点哭了。老师周一还要看结果。这是让我哭死的节奏。对叭起,是我不好,荒废时光,做东西还这么慢,出不来好结果,稍微改动一点都要这么久。呜呜呜,人家会慢慢进步的哦!
这里的解决办法是用screen方法来解决哦。
一句话来讲,就是通过一个命令让所要运行的程序一直挂在服务器上。
这个我也不是很清楚机制,一些命令分享给大家,大家想深入了解的话,搜一下关键词“服务器screen”就好啦。
么么~
screen -S sessionName 创建一个session
screen -ls 列出所有的session
screen -r 10649 用session -ls可以得到)进入指定screen
screen -d 10649 与10649分离
screen -d -r 10649 重新连接到10649 如果有需要则先分离
screen -x 10649 重新连接到10649
screen -X -S 19983 quit 删除19983
3. pytorch的loss使用
import torch
import numpy as np
loss_fn = torch.nn.MSELoss(reduce=False, size_average=False)
a=np.array([[1,2],[3,4]])
b=np.array([[2,3],[4,5]])
input = torch.autograd.Variable(torch.from_numpy(a))
target = torch.autograd.Variable(torch.from_numpy(b))
这里将Variable类型统一为float()(tensor类型也是调用xxx.float())
loss = loss_fn(input.float(), target.float())
print(loss)
pytorch的loss必须这样定义之后才能使用而不能直接引用输入参数哦。。。。
中秋节还在实验室改代码,跑实验的我只能说明,我是个又丑又穷又笨(~ ̄(OO) ̄)ブ滴人。呜呜呜,跑去角落哭一哭了,我们下次见咯。