前记
其实刚开始记录这个内容的时候,自己的内心是很纠结的,因为这本就不是我应该纠结的内容,coding是一个程序员必备的技能,不管他是处在一个什么岗位,但是自己貌似走入了一个误区,关于DeepLearning这一块,我一直在跑别人的代码,自认为理论熟悉了,代码写起来不就是小case么,自己是错了,因为,自己在写的时候,发现根本就写不出来,神经网络就是个黑盒子,看的轮子再多,自己没造一个轮子的话,那么万一轮子不存在呢?
有错误,就需要改正,有改正,就有进步,追着光亮那方......
回归函数
根据自己的经验(学习的经验),我们在构建网络时,不管是用Pytorch还是TensorFlow,最重要的是弄懂你需要计算的神经网络的结果,在TensorFlow里面叫做定义计算图(Compute Graph),这个内容是有助于我们理清思路,这对于刚写神经网络的我们来说好处是无比巨大的,现在养成一个好习惯,不论是多么复杂,多少层的神经网络,在计算之前,画出计算图,你会发现神经网络这个黑盒子或许不再黑了.....
好吧,扯了这么多,我们开始步入我们正题吧,在这里,我是自己生成训练数据以及训练结果,定义的数据之后,我们将其采用点图的形式画出来,代码如下:
# 生成训练数据
x=torch.unsqueeze(torch.linspace(-1,1,100),dim=1)
y=x.pow(2)+0.2*torch.rand(x.size())
# 查看x,y的形状
print(x.shape,y.shape)
然后我们看出生成的结果:
接下来就是定义我们的神经网络结构,在这里,我只是简单的定义一层网络结构,想让这层神经网络学习出我们想要的结果,按照之前说的,我们先画出计算图,
是不是很简单呢,有了这个计算图,我们很容易定义出我们的神经网络结构:
class Net(torch.nn.Module):
def __init__(self,n_feature,n_hidden,n_output):
super(Net,self).__init__()
# 定义隐藏层输入的size为n_feature,输出的size为n_hidden
self.hidden=torch.nn.Linear(n_feature,n_hidden) # hidden layer
self.predict=torch.nn.Linear(n_hidden,n_output) # output layer
def forward(self,x):
x=F.relu(self.hidden(x)) # activation function for hidden layer
y=self.predict(x) # linear output
return y
主体的神经网络结构在这里我们已经定义完成了,后面的就是进行神经网络的训练了,神经网络的训练一般是遵循以下四个步骤,定义好了这四个步骤,我们就可以开始愉快的进行训练了......
# 确定优化器
optimizer=torch.optim.SGD(net.parameters(),lr=0.2)
# 定义损失函数,采用均方误差
loss_func=torch.nn.MSELoss()
# 定义epoch
EPOCHES=2000
for epoch in range(EPOCHES):
# 步骤1:去除每一步记录的梯度
optimizer.zero_grad()
# 步骤2:将题目给的输出转为我们神经网络能够接收的输人
# 步骤3:运行前向算法
prediction=net(x)
# 计算损失函数,并且进行梯度更新
loss=loss_func(prediction,y)
loss.backward()
optimizer.step()
if epoch%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(),fontdict={'size':20,'color':'red'})
plt.pause(0.1)
总结
是开始,也是新的方向,fighting,fighting,fighting!
完整的代码,请移步我的GitHub.
Reference
https://morvanzhou.github.io/tutorials/machine-learning/torch/3-01-regression/