pytorch学习笔记(一)
pytorch学习笔记(一)
一、随便说说
学习pytorch是实验室安排的任务,当然不是很建议大家直接来学习框架,于我,虽然基础也不够牢,不过还是做了一些铺垫,像cs231n刚看完而且assignment也都做了一些和消化了大部分,也比较建议去看一看和完成一下相应的assignment吧。
然后就是西瓜书在也看(里面的数学公式是真的多。。看的头皮发麻)不过这是一本机器学习入门很不错的一本书在此推荐
本人即将大三,水平很一般,不是那种大神级别的能给大家把pytorch安排的明明白白,恰恰相反,我也是刚开始看pytorch tutorials,也算是一种同步自己的学习进度并分享一些自己的收获吧,也会通过自己所学的一些东西,讲出自己对于一些模型、函数的理解,也是首次写博客,排版啥的就很一般了。
2.简单讲讲pytorch吧
pytorch是基于Python的科学计算包,教程里面给的两大特点:
1.是一种在gpu上对于numpy的取代
2.一个能提供极大灵活度和速度的深度学习平台
至于怎么配置安装pytorch,网上很多,我这里就不放教程了,gpu和cpu版本大家要注意区分
好了,就这么多
3.开始学习吧
PS:这次写可能很多和教程中的相仿,就把它当做一种翻译吧,也会讲一讲python的 一些语法吧,到了后面涉及到一些有关机器学习的知识也会再做补充
3.1 Tensors(张量)
通俗点讲,张量在这里就是n维数组的意思,
from __future__ import print_function#__future__模块,把下一个新版本的特性导入到当前版本
import torch#引入torch包,就可以用torch里面的各种函数
简单介绍一些相关函数:
x = torch.empty(5,3)#创建一个未初始化的5x3的矩阵
print(x)
输出:
tensor([[3.1351e+12, 4.5750e-41, 3.1351e+12],
[4.5750e-41, 1.8325e-09, 3.0813e-41],
[1.4013e-45, 0.0000e+00, 1.8326e-09],
[3.0813e-41, 1.7862e-09, 3.0813e-41],
[1.7862e-09, 3.0813e-41, 0.0000e+00]])
x = torch.rand(5,3)#创建一个随机初始化的5x3矩阵
print(x)
输出:
tensor([[0.0123, 0.4279, 0.5089],
[0.9925, 0.0714, 0.1149],
[0.7636, 0.2003, 0.1347],
[0.6978, 0.3093, 0.2787],
[0.1154, 0.0255, 0.7935]])
这些函数都比较基础,不每个都拿出来说了,每个种类挑几个吧
下面部分函数不展示输出结果了
torch.add(x,y)#x+y
y.add_(x)#y+=x,任何操作带有下划线'_',那么前面的变量就会被取代,如例中y
print(x[:,1])#打印x矩阵中第二列所有元素,注意大部分语言中都是从0开的
基本操作就说这么多,如果还想看更多的函数,去文档里面看
3.2 Autograde
所有pytorch中神经网络的核心就是autograd包,先来简单看看。
1.Tensor
.torch.tensor是这个包的核心类,如果把.requires_grad属性设置为True,它就会跟踪这上面的所有操作,当你完成了操作你可以调用.backward()就会自动计算所有的梯度(梯度是计算神经网络中必不可少的环节,一般会用梯度下降算法来更新权值和减少损失增加预测的准确度),这个张量的梯度会被累积在.grad属性中。
.detach()可以停止张量跟踪历史记录,把张量和计算历史分开并且能阻止未来的计算被追踪
代码块with torch.no_grad():可以保护追踪的历史和使用过的记忆,这个代码块适用于我们把.requires_grad属性设置为True但我们不需要梯度的情况
import torch
x=torch.ones(2,2,requires_grad=True)#创建一个2x2单位矩阵,并设置.requires_grad属性设置为True
y = x+2
print(y)
z = y*y*3#*在这里相当于矩阵中的点乘,即相应元素相乘,而这个3是自动填充扩展成与y规格一样的全3矩阵
out = z.mean()#求z矩阵的均值
print(z,out)
输出
tensor([[3., 3.],
[3., 3.]], grad_fn=<AddBackward>)
tensor([[27., 27.],
[27., 27.]], grad_fn=<MulBackward>) tensor(27., grad_fn=<MeanBackward1>)
我们可以发现输出多了一个grad_fn属性,这个属性是表明这个矩阵是通过什么方式产生的,比如y矩阵就是通过加法运算,z通过乘法运算,out通过求均值运算,如果一个矩阵是由人创建的,则grad_fn is none
2.Gradients
out已经是一个标量了,现在开始进行反向传播看看梯度是怎么计算的吧
>>> out.backward()
>>> print(x.grad)#打印out关于x的梯度
tensor([[4.5000, 4.5000],
[4.5000, 4.5000]])
我们来看看怎么计算得到的,根据前面的公式,我们可以知道
此外,除了这样直接的计算,还可以用cs231n中提到的链式求导法则,一步步回退到每一步的梯度,这样会更直观
4.
第一次写,先写这么多吧,下次开始看看一些神经网络初级