【发布时间】:2021-07-17 11:16:23
【问题描述】:
我正在使用 Pytorch 实现一个简单的前馈神经网络,并且损失函数似乎没有减少。由于我已经完成了一些其他测试,问题似乎出在我为计算 pred 所做的计算中,因为如果我稍微改变网络以便它为每个条目吐出一个二维向量并将其保存为 pred,一切正常。
你看到这里定义 pred 的问题了吗?谢谢
import torch
import numpy as np
from torch import nn
dt = 0.1
class Neural_Network(nn.Module):
def __init__(self, ):
super(Neural_Network, self).__init__()
self.l1 = nn.Linear(2,300)
self.nl = nn.Tanh()
self.l2 = nn.Linear(300,1)
def forward(self, X):
z = self.l1(X)
z = self.nl(z)
o = self.l2(z)
return o
N = 1000
X = torch.rand(N,2,requires_grad=True)
y = torch.rand(N,1)
NN = Neural_Network()
criterion = torch.nn.MSELoss(reduction='sum')
optimizer = torch.optim.Adam(NN.parameters(), lr=1e-5)
epochs = 200
for i in range(epochs): # trains the NN 1,000 times
HH = torch.mean(NN(X))
gradH = torch.autograd.grad(HH, X)[0]
XH= torch.cat((gradH[:,1].unsqueeze(0),-gradH[:,0].unsqueeze(0)),dim=0).t()
pred = X + dt*XH
#Optimize and improve the weights
loss = criterion(pred, y)
optimizer.zero_grad()
loss.backward()
optimizer.step()
print (" Loss: ", loss.detach().numpy()) # mean sum squared loss
附:有了这些 X 和 y,损失预计不会为零,为了简单起见,我将它们像它们一样添加在这里。我将把这个架构应用到期望满足这个模型的数据点上。不过,我只想看到损失减少。
我的目标是用神经网络近似一个向量场的哈密顿量,其中只有一些轨迹是已知的。例如,仅更新x(t)\rightarrow x(t+\Delta t) 用于某些点的选择。所以向量X 包含点x(t),而y 包含$x(t+\Delta t)$。我上面的网络以简单的方式近似哈密顿函数H(x),为了优化它,我需要找到与这个哈密顿函数相关的轨迹。
特别是XH 旨在成为与近似哈密顿量相关的哈密顿矢量场。时间更新pred = X + dt*XH简直是欧拉前进了一步。
但是,我在这里的主要问题可以抽象为:如何将网络相对于其输入的梯度包含在损失函数中?
【问题讨论】:
标签: python neural-network pytorch loss-function