一、前言
用了Matlab搭建神经网络才愈发感觉"人生苦短,我用PyTorch“是多么正确。毕竟新的神经网络架构还是得自己一点点敲,现在是一点都笑不出来了,指望Matlab提供的老框架和训练算法也做不出什么算法方法的突破,顶多就是在实现功能上方便点罢了。
本博文要求读者有一定的Python编程基础!,对机器学习和神经网络有一定的了解!。如果是零基础学习人群,请参看我之前的Python基础语法博文和人工智能相关博文。读完它们不会花费你太多的时间,并且如果你能做到简单地阅览完这些博文,就完全有足够的知识储备来彻底搞懂这篇博文的全部内容了。
二、深度学习框架——PyTorch
2.1 PyTorch介绍
PyTorch是 Facebook 发布的一款深度学习框架,和Tensorflow,Keras,Theano等其他深度学习框架都不同。作为动态计算图模式,其应用模型支持在运行过程中根据运行参数动态改变,而其他几种框架都是静态计算图模式,其模型在运行之前就已经确定。
Python模块可以通过pip安装,临时使用时可以使用下述命令:
pip install pythonModuleName -i https://pypi.douban.com/simple
也可以永久更改:/root/.pip/pip.conf:
[global] index-url = https://pypi.douban.com/simple
2.2 Python安装详解
安装Python就略去不写了,都是可视化界面也没什么可说的。安装后查看当前版本
[root@iZ25ix41uc3Z ~]# python --version Python 3.10.9
下载 setuptools:
wget --no-check-certificate http://pypi.python.org/packages/source/s/setuptools/setuptools- 解压之后进入目录setuptools-0.6c11 安装python setup.py install
安装 pip,和 setuptools 过程类似:
wget --no-check-certificate https://github.com/pypa/pip/archive/1.5.5.tar.gz 解压之后进入目录pip-1.5.5 安装python setup.py install
看看 pip 安装是否成功,执行:
pip list
如果显示的不是上方的画面,则我们先安装 openssl:
yum install openssl openssl-devel -y
然后再重新安装 python,别的不用重新安装了。
[root@iZ25ix41uc3Z Python-3.10.9]# pip list pip (1.5.4) setuptools (27.3.0) wsgiref (0.1.2)
最后我们就可以安装 numpy,scipy 等科学计算库了。
pip install numpy pip install scipy
最后验证一下 numpy:
大功告成,如此一来我们已经成功安装 numpy。
2.3 PyTorch安装详解
先试试看 pip 安装能不能成功。输入命令 pip install pytorch,显示结果如下:
看来PyTorch不支持pip安装,这里提示到 pytorch.org 下载安装,同时,浏览器自动打开网址:
http://pytorch.org/#pip-install-pytorch
跟着上面的安装步骤安装就是了,这里也可以去网上找找安装教程。因为这里不是我们的重点,讲多了也没什么意思。
安装完成后,我们输入命令 python,进入 python 交互环境,写一段 pytorch 程序验证一下是不是安装成功了,这段代码调用 torch 的ones 方法,看看能不能正常显示结果:
看来没什么问题,安装成功了。下面,我们来一步步学习 pytorch 吧。
三、变量
先看看 Tensor,pytorch 中的数据都是封装成 Tensor 来引用的,Tensor实际上就类似于 numpy 中的数组,两者可以自由转换。
我们先生成一个3*4维的数组:
import torch x = torch.Tensor(3,4) print("x Tensor: ",x)
可以看到 torch.Tensor() 方法生成制定维度的随机数。
下面看看 Variable 的基本操作,引用 Variable:
import torch from torch.autograd import Variable x=Variable(torch.Tensor(2,2)) print("x variable: ",x)
Variable 不光包含了数据,还包含了其他东西,那么,还包含什么东西呢?
默认 Variable 是有导数 grad 的,x.data 是数据,这里 x.data 就是 Tensor。x.grad 是计算过程中动态变化的导数。
print ("x.data: ",x.data, ",x.grad: ",x.grad)
此时 Variable 还未进行计算,因此 x.grad 为 None。
四、求导
神经网络中的求导的作用是用导数对神经网络的权重参数进行调整。
Pytorch 中为求导提供了专门的包,包名叫autograd。如果用autograd.Variable 来定义参数,则 Variable 自动定义了两个变量:data代表原始权重数据;而 grad 代表求导后的数据,也就是梯度。每次迭代过程就用这个 grad 对权重数据进行修正。
import torch from torch.autograd import Variable x = Variable(torch.ones(2, 2), requires_grad=True) print(x)
输出为:
y=x+2 print(y)
输出为:
z = y * y * 3 out = z.mean() print(z, out)
输出为:
out.backward()
反向传播,也就是求导数的意思。输出 out 对 x 求导:
print(x.grad)
4.5 是怎么算出来的呢,从前面的公式可以看出 z=(x+2) * (x+2) * 3,它的导数是 3 * (x+2) / 2,当 x=1 时导数的值就是 3 * (1+2) / 2=4.5,和 pytorch 计算得出的结果是一致的。
权值更新方法:
weight = weight + learning_rate * gradient
learning_rate = 0.01 for f in model.parameters(): f.data.sub_(f.grad.data * learning_rate)
learning_rate 是学习速率,多数时候就叫做 lr,是学习步长,用步长 * 导数就是每次权重修正的 delta 值,lr 越大表示学习的速度越快,相应的精度就会降低。