- 输入
#导入模块
import torch
import torch.nn.functional as F
from torch.autograd import Variable
import matplotlib.pyplot as plt
x=torch.unsqueeze(torch.linspace(-1,1,100),dim=1)
#对输入的制定位置插入维度 1,无torch.unsqueeze,x是向量torch.Size([100]),有之后x是 torch.Size([100, 1])的矩阵
y=x**2+0.2*torch.rand(x.size())#x的平方,加噪声(从区间[0,1)的均匀分布中抽取的一组随机数,输出形状与x相同)
print(x,y,x.size())
x,y=Variable(x),Variable(y)#将x,y张量转化为变量
class Net(torch.nn.Module):
def __init__(self,n_feature,n_hidden,n_output):#搭建层所要的初始信息,特征数,隐藏层单元数和输出单元数
super(Net,self).__init__()#继承Net到模块,官方步骤
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))#self.hidden(x)给x加权成为a,用激励函数将a变成特征b
x=self.predict(x)#self.predict(b)给b加权,预测最终结果
return x#返回最终预测值
net=Net(1,10,1)#只有一个输入单元,一个输出单元,隐藏单元定为10个
print(net) #搭建神经网络完毕
plt.ion()
plt.show()
opt=torch.optim.SGD(net.parameters(),lr=0.5)#设置学习率为0.5,用随机梯度下降法优化net神经网络的参数
lossfunc=torch.nn.MSELoss()#设置损失函数为均方差函数
for t in range(100):#训练步数100
prediction=net(x)#预测值
loss=lossfunc(prediction,y)#预测值与真实值的误差
opt.zero_grad()#梯度降0
loss.backward()#反向传播
opt.step()#梯度优化
if t%5==0:#此时,打印一下图片
plt.cla()#清除当前图形中的当前活动轴,其他轴不受影响。
plt.scatter(x.data.numpy(),y.data.numpy())#numpy类型才支持plt,所以要转化
plt.plot(x.data.numpy(),prediction.data.numpy(),'r-',lw=3)#拟合线图
plt.text(0.5,0,'loss=%.4f'%loss.data[0],fontdict={'size':10,'color':'red'})#在(0.5,0)的位置写loss的变化
plt.pause(0.1)#间隔时间
plt.ioff()
plt.show()
#最后画出的是动图
- 输出
神经网络
Net(
(hidden): Linear(in_features=1, out_features=10, bias=True)
(predict): Linear(in_features=10, out_features=1, bias=True)
)
图形
参考:莫烦python