以前的文章有提到,pytorch的入门让人无比愉悦的。但毕竟是深度学习,我说的门槛是和tensorflow比,自己深度学习对于微积分,线性代数和几率论仍是有必定要求的。固然,仍是那句话,其实深度学习涉及的数学原理,比什么SVM,CRF要简单太多,并且深度学习的变化和应用场景比前者要多得多,因此学习深度学习是颇有意义的。python
不少官方或非官方的demo,都是长篇大论,由于要演示一个例子,须要准备数据,其实大部分的代码是在准备数据,预处理,与深度学习自己没有太大关系。这样看起来不直观,把初学者都给吓住了。因此,打算写一个入门系列,就是手动造一些简单的数据,就是为了演示用。网络
本文要实现线性函数的拟合,就是好比y = 2*x+3这样的线性函数。首先标准的步骤,导入torch和Variable。函数
import torch from torch.autograd import Variable
而后准备简单的数据,x=1,2,3, y = 2,4,6, 线性关系就是y=2*x。注意这里的tensor是3行一列,而后转为Variable。学习
x_data = Variable(torch.Tensor([[1.0],[2.0],[3.0]])) y_data = Variable(torch.Tensor([[2.0],[4.0],[6.0]]))
而后就能够定义网络了,全部的模型都须要继承自nn.Module。而后定义一个线性层,参数为1,1。实现forward函数,用做训练迭代。测试
import torch.nn as nn class Model(nn.Module): def __init__(self): super(Model,self).__init__() self.linear = nn.Linear(1,1) def forward(self,x): y_pred = self.linear(x) return y_pred
直接实例化模型,并定义损失函数,这里按咱们高数里学的,使用最小二乘法。而后使用随机梯度降低对全部可优化参数进行优化,lr是learning_rate学习速率,也就是梯度变化步长。优化
model = Model() criterion = nn.MSELoss(size_average=False)
params = model.parameters() optimizer = torch.optim.SGD(params=params,lr=0.01)
开发循环迭代500次,用x_data经过model获得y_pred,也是一个3x1的矩阵。而后经过criterion求loss值。人工智能
for epoch in range(500): y_pred = model(x_data)#3x1 loss = criterion(y_pred,y_data) #这里能够把loss打印出来看,值都是同样的,由于咱们没有优化参数。使用data[0]是由于loss.data是一个list print(epoch,loss.data[0]) #而后是三步标准的,导数归0,反向求导,反向传播
optimizer.zero_grad() loss.backward() optimizer.step()
这里值得注意就是每一个epoch,梯度都要归零。
print('训练完成!') x_test = Variable(torch.Tensor([[4.0]])) y_test = model(x_test) #y_test是一个Variable,包括.data是一个FloatTensor,size=1x1 print('x_test:%d,预测值为%f'%(x_test.data[0][0],y_test.data[0][0]))
最后使用训练好的模型去测试,看下结果:继承
训练完成!开发
x_test:4,预测值为7.975748深度学习
关于做者:魏佳斌,互联网产品/技术总监,北京大学光华管理学院(MBA),特许金融分析师(CFA),资深产品经理/码农。偏心python,深度关注互联网趋势,人工智能,AI金融量化。致力于使用最前沿的认知技术去理解这个复杂的世界。
扫描下方二维码,关注:AI量化实验室(ailabx),了解AI量化最前沿技术、资讯。