目录
.1构建数据点集
在搭建神经网络之间我们需要明确数据集是什么,训练的目的是什么
下图第一个数据集是手写数字,第二个是行驶的车辆,第三个是语义分割的数据集
最后的希望的结果是
目标是看到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()
以下为加了噪声的散点图
.2搭建简单的神经网络
2.1网络构造
有了数据集之后,就可以开始搭建网络
可以直接用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)
至此就完成了简单的网络构造
2.2网络推理
2.2.1定义前向传播
def forward(self,x):
2.2.2定义激活函数
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
有了网络之后就可以对其进行训练:
2.2.3先是实例化网络
net = Net(1,10,1)
一个输入,隐藏层10个神经元,1个输出
然后可以打印net
print(net)
2.2.4定义一个优化器
optimizer=torch.optim.SGD(net.parameters(),lr=0.2)
2.2.5定义损失函数
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())
.3训练数据集分析结果
3.1训练过程
然后开始训练
3.1.1定义训练次数
训练500次
for t in range(500):
开始训练过程
3.1.2输出预测结果
让x依次传入网络乘以参数输出一个随机结果
prediction=net.forward(x)
3.1.3 输出损失值
loss=loss_func(prediction,y)
实际上就是预测值和真实值之间的差距
对应x传入网络输出的值和真实的y值(和x一一对应的值)之间的损失
3.1.4 优化器设置
把优化器梯度归零
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()
3.2 可视化训练过程
每五次显示一次训练结果
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也是不断变小