Hi,
If I setcuda = True
, it will cause errorone of the variables needed for gradient computation has been modified by an inplace operation
. but cuda = False
has no error. It really takes me a lot of time to find out the problem. Do you have any ideas?
class test_model(nn.Module):
def __init__(self,
in_channel=3,
num_class=60,
num_joint=25,
hidden_size =100,
window_size=64,
):
super(test_model, self).__init__()
self.lstm = nn.LSTM(input_size=in_channel * num_joint,
hidden_size=hidden_size, num_layers=3,
batch_first=True)
self.fc = nn.Linear(hidden_size*window_size, num_class)
def forward(self, x):
N, C, T, V, M = x.size()
logits = []
for i in range(2):
out = x[:, :, :, :, i].permute(0, 2, 1, 3).contiguous().view(N,T,C*V)
self.lstm.flatten_parameters()
out,_ = self.lstm(out)
logits.append(out)
# out = torch.max(logits[0], logits[1])
out = logits[1]+logits[0]
out = out.contiguous().view(out.size(0), -1)
out = self.fc(out)
return out
if __name__ == '__main__':
# cronstruct a dataset
data = []
label = []
epoches = 10
cuda = False
# cuda = True
for i in range(epoches):
data.append(torch.randn((2, 3, 64, 25, 2)))
label.append(torch.randn((2, 60)))
# model
model = test_model()
if cuda:
model= model.cuda()
optimizer = optim.Adam(model.parameters(), lr=0.001)
# cre = nn.CrossEntropyLoss()
cre = nn.MSELoss()
for i in range(epoches):
if cuda:
x = Variable(data[i]).cuda()
y = Variable(label[i]).cuda()
else:
x = Variable(data[i])
y = Variable(label[i])
out_put = model(x)
loss = cre(out_put, y)
# print(loss)
optimizer.zero_grad()
loss.backward()
optimizer.step()
print('end')