欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

pytorch学习笔记(一)

程序员文章站 2022-06-06 11:21:49
...

pytorch学习笔记(一)

一、随便说说

学习pytorch是实验室安排的任务,当然不是很建议大家直接来学习框架,于我,虽然基础也不够牢,不过还是做了一些铺垫,像cs231n刚看完而且assignment也都做了一些和消化了大部分,也比较建议去看一看和完成一下相应的assignment吧。

cs231n

然后就是西瓜书在也看(里面的数学公式是真的多。。看的头皮发麻)不过这是一本机器学习入门很不错的一本书在此推荐
pytorch学习笔记(一)

本人即将大三,水平很一般,不是那种大神级别的能给大家把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]])

我们来看看怎么计算得到的,根据前面的公式,我们可以知道

out=14izi,zi=3(xi+2)2,outx=32(xi+2)outx|x=1=4.5

此外,除了这样直接的计算,还可以用cs231n中提到的链式求导法则,一步步回退到每一步的梯度,这样会更直观

4.

第一次写,先写这么多吧,下次开始看看一些神经网络初级

相关标签: pytorch学习笔记