我正在制作一个简单的PyTorch神经网络来逼近x=[0,2pi]上的正弦函数。这是一个简单的架构,我使用不同的深度学习库来测试我是否理解如何使用它。未经训练的神经网络总是产生一条水平直线,而经过训练的神经网络则在y=0时产生一条直线。一般来说,它总是在y=(函数的平均值)处产生一条直线。这让我相信它的前支柱部分出了问题,因为边界不应该只是一条未经训练的直线。以下是网络的代码:
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.model = nn.Sequential(
nn.Linear(1, 20),
nn.Sigmoid(),
nn.Linear(20, 50),
nn.Sigmoid(),
nn.Linear(50, 50),
nn.Sigmoid(),
nn.Linear(50, 1)
)
def forward(self, x):
x = self.model(x)
return x
这是训练循环
def train(net, trainloader, valloader, learningrate, n_epochs):
net = net.train()
loss = nn.MSELoss()
optimizer = torch.optim.SGD(net.parameters(), lr = learningrate)
for epoch in range(n_epochs):
for X, y in trainloader:
X = X.reshape(-1, 1)
y = y.view(-1, 1)
optimizer.zero_grad()
outputs = net(X)
error = loss(outputs, y)
error.backward()
#net.parameters() net.parameters() * learningrate
optimizer.step()
total_loss = 0
for X, y in valloader:
X = X.reshape(-1, 1).float()
y = y.view(-1, 1)
outputs = net(X)
error = loss(outputs, y)
total_loss += error.data
print('Val loss for epoch', epoch, 'is', total_loss / len(valloader) )
它被称为:
net = Net()
losslist = train(net, trainloader, valloader, .0001, n_epochs = 4)
其中trainloader和valloader是培训和验证加载程序。有人能帮我看看这有什么问题吗?我知道它不是学习率,因为它是我在其他框架中使用的,我也知道它不是我使用SGD或sigmoid激活函数的事实,尽管我怀疑错误在激活函数的某个地方。你知道吗
有人知道怎么解决这个问题吗?谢谢。你知道吗
在玩了一段时间的超参数、修改网络和更改优化器(遵循this极好的配方)之后,我最终将行
optimizer = torch.optim.SGD(net.parameters(), lr = learningrate)
更改为optimizer = torch.optim.Adam(net.parameters())
(使用了default优化器参数),运行了100个时代,批大小等于1。你知道吗使用了以下代码(仅在CPU上测试):
Adam优化器的结果:
SGD优化器的结果:
通常,这意味着神经网络到目前为止只成功地训练了最后一层。你需要对它进行更长时间的训练或者更好的优化,就像ViniciusArruda在这里展示的那样。你知道吗
编辑:进一步解释。。当只训练了最后一层时,神经网络在不知道输入X的情况下有效地猜测输出y。在这种情况下,它能做出的最佳猜测是平均值。这样,它可以最大限度地减少其MSE损失。你知道吗
相关问题 更多 >
编程相关推荐