内容目录
@TOC
前言
终于到搭建神经网络了,开心吧!本博客会根据生成的数据搭建一个输入层节点1,单隐藏层(10节点),输出层(1节点)的前馈神经网络来拟合生成的数据。其中隐藏层使用relu激活函数,输出层不使用激活函数。网络结构如下图:
快速网络搭建
1 导入库
import torch
import torch.nn.functional as F
import matplotlib.pyplot as plt
import numpy as np
2 生成数据集
# 生成数据(fake data)
x = torch.linspace(-1,1,100).reshape(-1,1)
# 加上点噪声
y = x.pow(2) + 0.2*torch.rand(x.shape)
# 可视化一下数据
plt.scatter(x.data.numpy(),y.data.numpy())
plt.show()
输出:
3 网络搭建
class Net(torch.nn.Module):
def __init__(self,n_features,n_hidden,n_output):
# 继承原来结构体的全部init属性及方法
super(Net,self).__init__()
# 线性层就是全连接层
self.hidden = torch.nn.Linear(n_features,n_hidden)
self.predict = torch.nn.Linear(n_hidden,n_output)
def forward(self,x):
# 重写继承类的向前传播方法,就是在这个里面选择激活函数的
x = F.relu(self.hidden(x))
# 回归中输出层一般不用激活函数
# 例如这里的relu函数如果激活最后一层,小于0的带你全部变成0了,这肯定不是我们想要的
x = self.predict(x)
return x
4 传入网络结构、选择优化器、损失函数
net = Net(1,10,1)
print(net)
输出:
optimizer = torch.optim.SGD(net.parameters(),lr=0.5)
loss_func = torch.nn.MSELoss()
5 网络训练及交换演示(画动图)
# 开启matplotlib的交换模式
plt.ion()
for t in range(100):
# 这一步其实是调用了类里面的 __call__魔术方法,又学到一个魔术方法
prediction = net(x)
loss = loss_func(prediction,y)
# 梯度清零
optimizer.zero_grad()
# 误差反向传播,求梯度
loss.backward()
# 进行优化器优化
optimizer.step()
if
plt.cla()
plt.scatter(x.data.numpy(),y.data.numpy())
plt.plot(x.data.numpy(),prediction.data.numpy(),'r-',lw=5)
plt.text(0.5,0,'Loss
plt.pause(0.1)
# 关闭matplotlib的交换模式
plt.ioff()
plt.show()
# 有可能因为是在jupter中才输出的不是动画
输出:
6 打印最终模型参数
# 打印训练出的模型的参数
for name, param in net.named_parameters():
print(name, param.data)
输出:
总结
恭喜,看到这里相信你已经学会怎么用pytorch搭建前馈神经网络了。