有没有办法在 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)