在神经网络中尽管张量为叶子节点但损失却为None

0 投票
2 回答
42 浏览
提问于 2025-04-14 17:30

我检查了所有的张量和输入参数,它们都是叶子节点,按照下面的代码,

def train_step(w1,b1):
    print("w=",w1)
    trainable_variables = [w1,b1]
    optimizer = torch.optim.SGD(trainable_variables, lr=learning_rate)
    loss = Variable(loss2_function(), requires_grad = True)
    print(loss.backward())
    with torch.no_grad():
        w1 -=(learning_rate * w1.grad)
        b1 -= (learning_rate * b1.grad)
        w1.grad.zero_()
        b1.grad.zero_()
    optimizer.step()
    optimizer.zero_grad()

我还是没有得到任何结果,即使我调整了学习率、权重和偏置,网络还是不管用,请给我一些指导。

2 个回答

0

loss.backward() 这个命令不会返回任何东西。这就是为什么 print(loss.backward()) 会显示 None 的原因。

你应该用 print(loss) 来查看损失值。

1

在调用“loss.backward()”后没有返回任何东西:这里的“loss2_function()”应该返回一个标量张量,表示损失值,而不是返回反向传播的结果。所以,它只需要计算并返回损失值。确保“loss2_function()”能正确计算并返回损失张量。

更新权重和偏置:在更新权重和偏置时,你需要正确访问它们的梯度属性。此外,在更新参数后,你应该将它们的梯度清零。

import torch

def train_step(w1, b1, learning_rate, loss2_function):
    print("Initial weights: w =", w1, ", b =", b1)
    
    # Define trainable variables and optimizer
    trainable_variables = [w1, b1]
    optimizer = torch.optim.SGD(trainable_variables, lr=learning_rate)
    
    # Calculate loss
    loss = loss2_function()
    
    # Perform backpropagation
    loss.backward()
    
    # Update weights and biases using gradient descent
    with torch.no_grad():
        w1 -= learning_rate * w1.grad
        b1 -= learning_rate * b1.grad
        
        # Reset gradients to zero
        w1.grad.zero_()
        b1.grad.zero_()
    
    # Perform optimization step
    optimizer.step()
    
    # Print updated weights
    print("Updated weights: w =", w1, ", b =", b1)

确保“loss2_function()”能正确计算并返回损失张量。同时,确保你正确调用“train_step()”函数,并传入所有必需的参数。

撰写回答