pytorch学习笔记(一)

pytorch学习笔记(一)

一、随便说说

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

cs231n

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

本人即将大三,水平很一般,不是那种大神级别的能给大家把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)outxx=1=4.5 o u t = 1 4 ∑ i z i , z i = 3 ( x i + 2 ) 2 , 因 此 ∂ o u t ∂ x = 3 2 ( x i + 2 ) , 则 ∂ o u t ∂ x | x = 1 = 4.5

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

4.

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

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值