有没有办法在 pytorch 中训练具有可训练参数的神经网络?
Is there a way to train a neural network with untrainable params in torch?
所以,我正在尝试学习迁移学习并尝试在自动编码器中实现它,同时我已经冻结了一些初始层,然后我也在其中添加了新层,现在我正在尝试训练它但是由于某些原因,我无法训练他们。关于如何训练真正适用于无法训练的参数的任何概念?
这是我训练的代码,在反向传播中出现错误,它认为由于神经网络中的一些修改,它无法工作。
nb_epoch = 10
for epoch in range(1, nb_epoch+1):
train_loss = 0
s = 0. #Compute RMSE
for id_user in range(nb_users):
input = Variable(training_set_torch[id_user]).unsqueeze(0)#Batch of 1 input vector or else wont work
target = input.clone()
if torch.sum(target.data > 0) > 0: #Target.data is rating
output = net(input)
#Now we create optimize the memory
target.require_grad = False
output[target == 0] = 0
#calculating loss
loss = criterion(output, target)
#Average of movie considered like non zero ratings
mean_corrector = nb_users/float(torch.sum(target.data > 0)+ 1e-10)# 1e-10 is to avoid 0/0
#Now calling backward method
loss.backward()*
train_loss += np.sqrt(loss.data*mean_corrector)
s += 1.
#Using the Optimzer
optimizer.step()
#Printing what happens at every epoch
print('Epoch: ' +str(epoch)+ 'Loss: '+str(train_loss/s))
*发生错误
错误:梯度计算所需的变量之一已被就地操作修改:[torch.FloatTensor [1, 1000]],它是 SigmoidBackward 的输出 0,版本为 1;预期的版本 0 代替。提示:启用异常检测以找到未能计算其梯度的操作,其中 torch.autograd.set_detect_anomaly(True).
当我将其设置为 True 时,它显示另一个错误
错误:梯度计算所需的变量之一已被就地操作修改:[torch.FloatTensor [1, 1000]],它是 SigmoidBackward 的输出 0,版本为 1;预期的版本 0 代替。提示:上面的回溯显示了计算梯度失败的操作。有问题的变量在那里或以后的任何地方被改变了。祝你好运!
我怀疑是这条线引起了您的问题:
output[target == 0] = 0
尝试删除它,看看是否出现错误。
更新:
您可以删除这些条目,并通过将赋值替换为掩码乘法来仍然避免“in-place”错误:
output = output * (target != 0)
所以,我正在尝试学习迁移学习并尝试在自动编码器中实现它,同时我已经冻结了一些初始层,然后我也在其中添加了新层,现在我正在尝试训练它但是由于某些原因,我无法训练他们。关于如何训练真正适用于无法训练的参数的任何概念?
这是我训练的代码,在反向传播中出现错误,它认为由于神经网络中的一些修改,它无法工作。
nb_epoch = 10
for epoch in range(1, nb_epoch+1):
train_loss = 0
s = 0. #Compute RMSE
for id_user in range(nb_users):
input = Variable(training_set_torch[id_user]).unsqueeze(0)#Batch of 1 input vector or else wont work
target = input.clone()
if torch.sum(target.data > 0) > 0: #Target.data is rating
output = net(input)
#Now we create optimize the memory
target.require_grad = False
output[target == 0] = 0
#calculating loss
loss = criterion(output, target)
#Average of movie considered like non zero ratings
mean_corrector = nb_users/float(torch.sum(target.data > 0)+ 1e-10)# 1e-10 is to avoid 0/0
#Now calling backward method
loss.backward()*
train_loss += np.sqrt(loss.data*mean_corrector)
s += 1.
#Using the Optimzer
optimizer.step()
#Printing what happens at every epoch
print('Epoch: ' +str(epoch)+ 'Loss: '+str(train_loss/s))
*发生错误
错误:梯度计算所需的变量之一已被就地操作修改:[torch.FloatTensor [1, 1000]],它是 SigmoidBackward 的输出 0,版本为 1;预期的版本 0 代替。提示:启用异常检测以找到未能计算其梯度的操作,其中 torch.autograd.set_detect_anomaly(True).
当我将其设置为 True 时,它显示另一个错误
错误:梯度计算所需的变量之一已被就地操作修改:[torch.FloatTensor [1, 1000]],它是 SigmoidBackward 的输出 0,版本为 1;预期的版本 0 代替。提示:上面的回溯显示了计算梯度失败的操作。有问题的变量在那里或以后的任何地方被改变了。祝你好运!
我怀疑是这条线引起了您的问题:
output[target == 0] = 0
尝试删除它,看看是否出现错误。
更新:
您可以删除这些条目,并通过将赋值替换为掩码乘法来仍然避免“in-place”错误:
output = output * (target != 0)