为了加深大家对深度学习这一概念的理解,尤其是对深度(多层神经网络) 两个字的认识,笔者在本篇文章中将会通过一个拟合正弦函数例子再次介绍“深度”这一概念。但巧妇难为无米之炊,所以接下来笔者首先会以线性回归的实现为例,来简单介绍一下Pytorch;然后再来实现对正弦函数的拟合。
1 动手实现线性回归
1.1 深度学习框架
在前面介绍《跟我一起深度学习》这个专栏时我们就说到后面会使用Pytorch这个框架来进行相应模型的实现,但并未解释到它是用来干什么的。并且如果是接触过深度学习的同学肯定知道深度学习的相关框架不止Pytorch一种,还有Tensoflow、MXNet、PaddlePaddle等等,那我们为什么我们需要这些框架?根据笔者的认知来看,需要这些框架最重要的一个目的就是实现自动求导(Auto grad)。
在机器学习中,对于简单的线性回归或者是逻辑回归我们还能自己手动求得目标函数关于参数的梯度,但是在深度学习中这一想法几乎是不现实的。因为在深度学习中普遍的网络结构相较于线性回归都要复杂很多,所以如何快速实现对参数梯度求解便是深度学习框架的核心功能之一。
下面就以线性回归为例,来向大家展示一下如何使用Pytorch进行建模。同时需要提醒的是,如果有时间可以自己先行去了解一下Pytorch中的基本操作[1];如果没有时间也没关系,跟着后面的文章学习就是,每遇到一个新的知识点笔者都会进行介绍。
1.2 安装Pytorch
对于Pytorch的安装,官方网站的引导可谓十分友好,相比起Tensorflow简直不能太好。打开Pytorch官网[2],然后点击Get started就能看到如下一张选项图,选择符合自己情况的选项记得得到相应的安装命令:
在得到安装命令后,激活之前主机上安装好的虚拟环境,然后运行即可:
如果出现如上提示,则表示Pytorch极其相关依赖库正在安装,如果长时间没有反映可以考虑切换一下安装源。安装成后则可以看到如下提示:
1.3 线性回归的实现
-
导入相关包
这里首先导入我们需要用到的相关包,在本示例中一共有4个:
from sklearn.datasets import load_boston from sklearn.preprocessing import StandardScaler import numpy as np import torch
前三个我们之前都用过就不再做介绍,第4个就是我们安装好的Pytorch框架。
-
载入数据
def load_data(): data = load_boston() x, y = data.data, data.target ss = StandardScaler() x = ss.fit_transform(x)# 特征标准化 x = torch.tensor(x, dtype=torch.float32) y = torch.tensor(y, dtype=torch.float32) return x, y
上述代码中,前面5行我们之前也都用过;而第6,7行的作用就是将
numpy
类型的变量转化为Pytorch框架所接受的tensor
张量。同时需要注意的是,在使用所有有关torch
方法时,其所接收的变量都必须是<class 'torch.Tensor'>
类型的,如果不是则需要通过torch.tensor()
进行转换。 -
预测
def forward(x, weights, bias): # 预测 y = torch.matmul(x, weights) + bias return y
这几行代码与之前在机器学习中用
numpy
实现的并无太大差异,只是将np.matul
变成了torch.matul
。同时,在定义这个函数时我们并没有使用prediction这个名字,而是使用了forward这个词,具体含义我们后续再解释。 -
定义损失
de