在神经网络中尽管张量为叶子节点但损失却为None
我检查了所有的张量和输入参数,它们都是叶子节点,按照下面的代码,
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()”函数,并传入所有必需的参数。