[英]Torch neural network does not train
我在torch
框架中实现了一个非常简单的神经网络
def mlp(sizes, activation, output_activation=torch.nn.Identity):
layers = []
for j in range(len(sizes)-1):
act = activation if j < len(sizes)-1 else output_activation
layers += [torch.nn.Linear(sizes[j], sizes[j+1]), act()]
return torch.nn.Sequential(*layers)
为了训练网络对函数 y=sin(x) 进行回归
x = torch.linspace(-math.pi, math.pi, 2000, device=device, dtype=dtype)
y = torch.sin(x)
培训代码在这里
size = [1,20,20,1]
activation = torch.nn.ReLU
model = mlp(size, activation)
optimizer = torch.optim.SGD(model.parameters(), lr=0.002)
n_epoch = 600
mse_loss = torch.nn.MSELoss()
X = x.unsqueeze(-1)
for i in range(n_epoch):
y_pred = model(X)
step_loss = mse_loss(y_pred, y)
optimizer.zero_grad()
step_loss.backward()
optimizer.step()
不幸的是,网络只学习了一个几乎恒定的函数 $y=0$。 我已经尝试了很多东西
但似乎没有任何效果。 问题很简单,我认为代码中有错误。
我不确定这是否是主要原因,但声明
act = activation if j < len(sizes)-1 else output_activation
似乎逻辑不正确。 在循环中, j
可以取从0
到len(sizes)-1
的值,因此条件始终为真。 这意味着你的网络最后有一个 ReLU,因此只能给出非负输出。 这可以通过将该语句更改为:
act = activation if j < len(sizes)-2 else output_activation
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.