Conv neural network 向CONVLSM传递隐藏状态时发生CUDA错误

Conv neural network 向CONVLSM传递隐藏状态时发生CUDA错误,conv-neural-network,pytorch,lstm,Conv Neural Network,Pytorch,Lstm,我得到以下错误,这是回溯: Traceback (most recent call last): File "train.py", line 136, in <module> train(epoch) File "train.py", line 112, in train output = model(data, hc) # Get outputs of LSTM File "/home/ama1128/.conda/envs/ma

我得到以下错误,这是回溯:

Traceback (most recent call last):
  File "train.py", line 136, in <module>
    train(epoch)
  File "train.py", line 112, in train
    output = model(data, hc)             # Get outputs of LSTM
  File "/home/ama1128/.conda/envs/matrix/lib/python3.6/site-packages/torch/nn/modules/module.py", line 489, in __call__
    result = self.forward(*input, **kwargs)
  File "/scratch/ama1128/convLSTM/model.py", line 118, in forward
    hc = self.cell_list[t](input=x[0], prev_state=[h_0, c_0])
  File "/home/ama1128/.conda/envs/matrix/lib/python3.6/site-packages/torch/nn/modules/module.py", line 489, in __call__
    result = self.forward(*input, **kwargs)
  File "/scratch/ama1128/convLSTM/model.py", line 50, in forward
    combined = torch.cat((input, h_prev), dim=1) # concatenate along channel axis
RuntimeError: Expected object of backend CUDA but got backend CPU for sequence element 1 in sequence argument at position #1 'tensors'
convLSTMCell前进:

def前进(自身、输入、上一状态):
h_prev,c_prev=上一状态
组合=火炬。cat(输入,h_-prev,dim=1)#沿通道轴连接
combined_conv=self.conv(组合)
cc_i、cc_f、cc_o、cc_g=火炬分割(组合转换、自隐藏尺寸、尺寸=1)
i=火炬。乙状结肠(cc_i)
f=火炬。乙状结肠(cc_f)
o=火炬。乙状结肠(cc_o)
g=火炬塔恩(cc_g)
c_cur=f*c_prev+i*g
h_cur=o*torch.tanh(c_cur)
返回h_cur,c_cur
convLSTM类: 初始化状态:

def init_hidden(自身、批次大小):
隐藏=火炬零点(批次尺寸、自身隐藏尺寸[0]、自身高度、自身宽度)
单元格=火炬零点(批次尺寸、自身隐藏尺寸[0]、自身高度、自身宽度)
如果gpu:
hidden.cuda()
cell.cuda()
返回隐藏的单元格
convLSTM前进:

def前进(自身、x、hc):
输出=[]
国家=[]
x=火炬。取消(x,1)#将形状从(18,3128128)更改为(18,1,3128128)
h_0,c_0=hc
对于范围内的t(0,self.num_层):
如果t==0:
hc=self.cell\u list[t](输入=x[0],上一个状态=[h\u 0,c\u 0])
州。附加(hc)
隐藏,单元格=hc
outputs.append(hidden.view(3128128))
其他:
h、 c=状态[t-1]#解包以前的状态
如果gpu:
h、 cuda()
c、 cuda()
hc=self.cell_list[t](输入=x[t],上一状态=[h,c])#当前状态
states.append(hc)#存储下一个单元格的当前状态
隐藏,单元格=hc#解包当前状态
outputs.append(hidden.view(3128128))
在将输出传递给损失函数之前,使用
torch.stack
重新格式化输出。
我尝试将隐藏状态投射到gpu上,但错误仍然存在。发生了什么事?

我尝试在convLSTMCell前向循环中添加
如果gpu:h_prev.cuda()c_prev.cuda()
。我为输入打印了设备,它打印了0,但是当我为h_prev和c_prev打印设备时,我得到了以下错误:
RuntimeError:get_设备没有为带有CPU后端的张量实现
,我感到困惑。即使将cuda分配给h_prev和c_prev,为什么我仍然会出现这个错误?我现在通过将默认张量类型设置为cuda解决了这个问题,但我不认为这是最佳的,是吗?错误现在在训练循环中得到了修复,但在验证循环中没有。奇怪的是,验证循环与训练循环完全相同,只是没有
loss.backward()
optimizer.step()