为激活函数,通常情况下激活函数有以下几种,神经网络添加激活函数的原因是,线性函数的叠加无法表示非线性函数,本文采用的是 函数
是需要训练的神经网络参数, 是训练结果, 是真实结果,本文采用均方误差即:
除此之外也有一些其他的误差形式,这里就不一一举例。损失函数决定了优化目标,优化器通过梯度下降法优化,即:
是步长也叫学习率,当前 减去步长乘以梯度就是更新后的参数值,现成的梯度算法工具有很多,本文采用Adam。
在优化过程中需要对损失函数关于优化参数求导,获得每一个优化参数对损失函数的影响即梯度计算:
具体方法如下图所示,采用链式法则的方法从后往前计算,因此也叫反向传播。
x=torch.linspace(0,1,101).reshape(-1,1)
y=torch.sin(x)
class SimpleNN(nn.Module):
def __init__(self):
super(SimpleNN, self).__init__()
self.hidden =nn.Linear(1,64)#隐藏层
self.output = nn.Linear(64,1)#输出层
def forward(self, x):
x=torch.relu(self.hidden(x))#Relu激活函数
return self.output(x)
model = SimpleNN()#初始化模型
criterion = nn.MSELoss()#均方误差损失函数
optimizer = optim.Adam(model.parameters(), lr=0.001)#Adam优化器
num_epochs = 5000#训练5000次
train_losses = []
val_losses = []
for epoch in range(num_epochs):
model.train()#启用训练模式
optimizer.zero_grad()#清除梯度
output_train = model(x_train)#前向传播
loss_train = criterion(output_train, y_train)#计算训练集损失
loss_train.backward()#反向传播
optimizer.step()#更新参数
