import torch
import matplotlib.pyplot as plt
#torch.unsqueeze()度扩充,将1*100的tensor变为100*1的维度,作为完整数据集一次性喂给网络 还有squeeze正好相反
x=torch.unsqueeze(torch.linspace(-1,1,100),dim=1)#训练集-1到1共100个数据
y=x.pow(2)+0.2*torch.rand(x.size())#标签值
#画图
plt.scatter(x.data.numpy(),y.data.numpy())
plt.show()
#搭建神经网路
import torch.nn.functional as fun
#声明一个NN类,继承自torch.nn.Module
class Net(torch.nn.Module):
#初始化函数__init__
def __init__(self,n_feature,n_hidden,n_output): #参数为输入神经元,中间神经元,输出神经元
super(Net,self).__init__()#继承__init__功能
#定义隐藏层和输出层结构
self.hidden=torch.nn.Linear(n_feature,n_hidden)#隐藏层
self.predict=torch.nn.Linear(n_hidden,n_output)#输出层
#定义前向传播函数
def forward(self,x):#参数为输入层神经元
x=fun.relu(self.hidden(x))#先计算再relu激活,隐藏层传播
x=self.predict(x)#输出层
return x
#实例化Net类
net=Net(n_feature=1,n_hidden=10,n_output=1)
print(net)#打印网络结构
#训练网络
#声明优化器
optimizer=torch.optim.SGD(net.parameters(),lr=0.2)#传入net所有的参数,学习率
loss_fun=torch.nn.MSELoss()#均方根误差为指标
#迭代训练
for i in range(100):
prediction=net(x)#给网络喂数据集
loss=loss_fun(prediction,y)#计算预测值和真实值之间的误差
#bp优化过程
optimizer.zero_grad()#清空上一步的残余更新参数值
loss.backward()#误差反向传播,计算参数更新值
optimizer.step()#将参数的更新值施加到net的parameters上面
#动态可视化过程
plt.ion()#打开交互模式
plt.show()
#迭代训练
for i in range(100):
prediction=net(x)#给网络喂数据集
loss=loss_fun(prediction,y)#计算预测值和真实值之间的误差
#bp优化过程
optimizer.zero_grad()#清空上一步的残余更新参数值
loss.backward()#误差反向传播,计算参数更新值
optimizer.step()#将参数的更新值施加到net的parameters上面
if i%5==0:
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=%.4f' % loss.data.numpy(), bbox=dict(facecolor='red', alpha=0.5))#显示loss值
plt.pause(0.1)#暂停时间
plt.ioff()#关闭交互模式
plt.show()