目录
在搭建神经网络之间我们需要明确数据集是什么,训练的目的是什么
下图第一个数据集是手写数字,第二个是行驶的车辆,第三个是语义分割的数据集

最后的希望的结果是
目标是看到y=x^ 2的图像

制作的数据集是一系列含有噪声的而二维数据在y=x^ 2周围
- import torch
- import torch.nn.functional as f
-
- import matplotlib.pyplot as plt
- import matplotlib;matplotlib.use('TkAgg')
-
- x=torch.unsqueeze(torch.linspace(-1,1,100),dim=1)
- y=x.pow(2)+0.2*torch.rand(x.size())
-
- plt.scatter(x.data.numpy(),y.data.numpy())
- plt.show()
以下为加了噪声的散点图

有了数据集之后,就可以开始搭建网络
可以直接用torch内置的模版
class Net(torch.nn.Module):
然后定义构造方法;
输入,隐藏层,输出都内置为参数
- class Net(torch.nn.Module):
- def __init__(self,n_feature,n_hiddenn_out) -> None:
然后继承一下父类
- class Net(torch.nn.Module):
- def __init__(self,n_feature,n_hiddenn_out) -> None:
- super().__init__()
定义一下隐藏层:
self.hidden=torch.nn.Linear(n_feature,n_hidden)
再定义输出层:
self.predict=torch.nn.Linear(n_hidden,n_output)
至此就完成了简单的网络构造
def forward(self,x):
x=f.relu(self.hidden(x))
这样就有非线性特征
然后将激活后的值传入预测层
x=self.predict(x)
返回预测值
return x
完整网络:
- class Net(torch.nn.Module):
- def __init__(self,n_feature,n_hidden,n_output) -> None:
- super().__init__()
- self.hidden=torch.nn.Linear(n_feature,n_hidden)
- self.predict=torch.nn.Linear(n_hidden,n_output)
-
- def forward(self,x):
- x=f.relu(self.hidden(x))
- x=self.predict(x)
- return x
有了网络之后就可以对其进行训练:
net = Net(1,10,1)
一个输入,隐藏层10个神经元,1个输出
然后可以打印net
print(net)

optimizer=torch.optim.SGD(net.parameters(),lr=0.2)
loss_func=torch.nn.MSELoss()
初始参数是随机的,也可以打印
print(net.parameters())

完整编码:
- net = Net(1,10,1)
- # print(net)
-
- optimizer=torch.optim.SGD(net.parameters(),lr=0.2)
- loss_func=torch.nn.MSELoss()
- # print(net.parameters())
然后开始训练
训练500次
for t in range(500):
开始训练过程
让x依次传入网络乘以参数输出一个随机结果
prediction=net.forward(x)
loss=loss_func(prediction,y)
实际上就是预测值和真实值之间的差距
对应x传入网络输出的值和真实的y值(和x一一对应的值)之间的损失
把优化器梯度归零
optimizer.zero_grad()
然后反向传播
loss.backward()
然后迭代模型更新
optimizer.step()
完整编码:
- for t in range(500):
- prediction=net.forward(x)
- loss=loss_func(prediction,y)
- optimizer.zero_grad()
- loss.backward()
- optimizer.step()
每五次显示一次训练结果
if t%5==0:
输出预测结果和原始数据之间的差距:
-
- plt.cla()
- plt.scatter(x.data.numpy(),y.data.numpy())
- plt.plot(x.data.numpy(),prediction.data.numpy(),'r-',lw=5)
打印损失值
- print('loss=:',loss.data)
- plt.pause(0.1)
然后可视化
- plt.ioff()
- plt.show()
运行效果图


可以看到效果不断变好
loss也是不断变小

