回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我正在制作一个简单的PyTorch神经网络来逼近x=[0,2pi]上的正弦函数。这是一个简单的架构,我使用不同的深度学习库来测试我是否理解如何使用它。未经训练的神经网络总是产生一条水平直线,而经过训练的神经网络则在y=0时产生一条直线。一般来说,它总是在y=(函数的平均值)处产生一条直线。这让我相信它的前支柱部分出了问题,因为边界不应该只是一条未经训练的直线。以下是网络的代码:</p>
<pre><code>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
</code></pre>
<p>这是训练循环</p>
<pre><code>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) )
</code></pre>
<p>它被称为:</p>
<pre><code>net = Net()
losslist = train(net, trainloader, valloader, .0001, n_epochs = 4)
</code></pre>
<p>其中trainloader和valloader是培训和验证加载程序。有人能帮我看看这有什么问题吗?我知道它不是学习率,因为它是我在其他框架中使用的,我也知道它不是我使用SGD或sigmoid激活函数的事实,尽管我怀疑错误在激活函数的某个地方。你知道吗</p>
<p>有人知道怎么解决这个问题吗?谢谢。你知道吗</p>