接上一节的思路,这一节我们将使用神经网络来代替我们的之前的线性模型作为逼近函数。我们将保持其他的一切不变,只重新定义模型,小编这里构建的是最简单的神经网络,一个线性模块,一个激活函数,然后一个线性模块。
seq_model = nn.Sequential(OrderedDict([
('hidden_linear', nn.Linear(1, 8)),
('hidden_activation', nn.Tanh()),
('output_linear', nn.Linear(8, 1))
]))
这个代码片段定义了一个简单的神经网络模型,使用nn.Sequential
和OrderedDict
来组织模型的层。这个模型包含一个隐藏层和一个输出层,隐藏层使用Tanh激活函数。
模型结构
- 隐藏层 (
hidden_linear
):- 输入维度: 1
- 输出维度: 8
- 线性变换:
nn.Linear(1, 8)
- 激活函数 (
hidden_activation
):- 激活函数: Tanh (
nn.Tanh()
)
- 激活函数: Tanh (
- 输出层 (
output_linear
):- 输入维度: 8
- 输出维度: 1
- 线性变换:
nn.Linear(8, 1)
for name, param in seq_model.named_parameters():
print(name, param.shape)
seq_model.named_parameters()
方法用于遍历模型中的所有参数,并返回每个参数的名称(name)和参数本身(params)
其他的没有变化
from collections import OrderedDict
seq_model = nn.Sequential(OrderedDict([
('hidden_linear', nn.Linear(1, 8)),
('hidden_activation', nn.Tanh()),
('output_linear', nn.Linear(8, 1))
]))
optimizer = optim.SGD(seq_model.parameters(), lr=1e-4) # <1>
training_loop(
n_epochs=100000,
optimizer=optimizer,
model=seq_model,
loss_fn=nn.MSELoss(),
t_u_train=t_un_train,
t_u_val=t_un_val,
t_c_train=t_c_train,
t_c_val=t_c_val)
print('output', seq_model(t_un_val))
print('answer', t_c_val)
print('hidden', seq_model.hidden_linear.weight.grad)
from matplotlib import pyplot as plt
t_range = torch.arange(20., 90.).unsqueeze(1)
fig = plt.figure(dpi=100)
plt.xlabel("Fahrenheit")
plt.ylabel("Celsius")
plt.plot(t_u.numpy(), t_c.numpy(), 'o')
plt.plot(t_range.numpy(), seq_model(0.1 * t_range).detach().numpy(), 'c-')
plt.plot(t_u.numpy(), seq_model(0.1 * t_u).detach().numpy(), 'kx')
plt.show()
可以看到即使使用神经网络进行训练还是有点过拟合的现象发生,总的来说做的还不错