深度学习之30分钟快速入门pytorch(附学习资源推荐)(代码片段)

我是管小亮 我是管小亮     2023-03-09     600

关键词:

目录

1、Pytorch简介

1.0 如何使用本教程

别有心理压力,只要跟着我一步一步来,你会发现其实并没有想像中的那么困难。当然,如果你看完了这篇教程之后,发现自己明白了很多,却又几乎什么都记不得,那也是很正常的——我认为,这里只是让你明白基本的原理和怎么应用,以后你还需要多练习,多使用,才能熟练掌握pytorch的使用。

最重要的是——请给我30分钟,不会让你失望的 😃

1.1 PyTorch由来

当前深度学习的框架有很多,其中较为出名的是Google的TensorFlow、Facebook的PyTorch,还有就是百度的paddlepaddle,TensorFlow的地位在目前看来确实是举足轻重的,社区的庞大也是它非常火的原因,paddlepaddle作为国产的框架之光,我个人的期待还是很高的,有兴趣的可以看一下paddlepaddle的介绍——【PaddlePaddle】百度深度学习平台PaddlePaddle:等待你我一起划桨的AI大船

因为TensorFlow和paddlepaddle比较相似,所以很多人都会拿Facebook的PyTorch和Google的Tensorflow进行比较。但是我们今天的主角是PyTorch,说到PyTorch其实应该先说Torch

1.2 Torch简介

Torch英译中:火炬

  1. What is the relationship between PyTorch and Torch?

A Tensor library like Numpy, unlike Numpy it has strong GPU support. Lua is a wrapper for Torch (Yes! you need to have a good understanding of Lua), and for that you will need LuaRocks package manager.

Torch是一个与Numpy类似的张量(Tensor)操作库,与Numpy不同的是Torch对GPU支持的很好,Lua是Torch的上层包装。

  1. Roadmap for torch and pytorch

Torch is not going anywhere. PyTorch and Torch use the same C libraries that contain all the performance: TH, THC, THNN, THCUNN and they will continue to be shared.
We still and will have continued engineering on Torch itself, and we have no immediate plan to remove that.

PyTorch和Torch使用包含所有相同性能的C库:TH, THC, THNN, THCUNN,并且它们将继续共享这些库。

这样的回答就很明确了,其实PyTorch和Torch都使用的是相同的底层,只是使用了不同的上层包装语言。

1.3 重新认识PyTorch

  1. 维基百科PyTorch

PyTorch is an open source machine learning library for Python, based on Torch, used for applications such as natural language processing. It is primarily developed by Facebook’s artificial-intelligence research group, and Uber’s “Pyro” software for probabilistic programming is built on it.

PyTorch是一个基于Torch的Python开源机器学习库,用于自然语言处理等应用程序。 它主要由Facebook的人工智能研究小组开发。Uber的"Pyro"也是使用的这个库。

  1. GitHub PyTorch

PyTorch is a Python package that provides two high-level features:
Tensor computation (like NumPy) with strong GPU acceleration
Deep neural networks built on a tape-based autograd system
You can reuse your favorite Python packages such as NumPy, SciPy and Cython to extend PyTorch when needed.

PyTorch是一个Python包,提供两个高级功能:

  • 具有强大的GPU加速的张量计算(如NumPy)
  • 包含自动求导系统的的深度神经网络
  • 您可以重用您最喜欢的Python包,如NumPy、SciPy和Cython,以便在需要时扩展PyTorch。

1.4 PyTorch和Tensorflow的对比

没有好的框架,只有合适的框架。

一般开源项目的热度指标从 GitHub 可以略见一斑,PyTorch 的数据是这样的(截止19.8.23):

  • star(可以认为是技术人的点赞)有31004人;

  • forks(想要自己基于此做修改)有7586人;

  • commits(代码总共的更新次数)有20095次;

  • contributors(代码贡献者)有1139个。

  • star(可以认为是技术人的点赞)有132923人;

  • forks(想要自己基于此做修改)有76885人;

  • commits(代码总共的更新次数)有63438次;

  • contributors(代码贡献者)有2153个。

结果似乎不言而喻了,TensorFlow的热度确实要远远高与PyTorch,这篇知乎文章有个简单的对比。

但是技术是发展的,知乎上的对比是发布于 2017-08-20的,比如Tensorflow在1.5版的时候就引入了Eager Execution机制实现了动态图,PyTorch的可视化,windows支持,沿维翻转张量等问题都已经不是问题了。

1.5 总结

  • PyTorch算是相当简洁优雅且高效快速的框架
  • 设计追求最少的封装,尽量避免重复造轮子
  • 算是所有的框架中面向对象设计的最优雅的一个,设计最符合人们的思维,它让用户尽可能地专注于实现自己的想法
  • 大佬支持,与Google的Tensorflow类似,Facebook的支持足以确保PyTorch获得持续的开发更新
  • 不错的的文档,PyTorch作者亲自维护的论坛供用户交流和求教问题
  • 入门简单

2、Pytorch环境搭建

PyTorch的安装十分简单,根据PyTorch官网,对系统选择和安装方式等灵活选择即可。这里以anaconda为例,Windows10 下 Anaconda和 PyCharm 的详细的安装教程(图文并茂),简单的说一下步骤和要点。

国内安装anaconda建议使用中科大镜像,快的不是一点半点。目前中科大、清华镜像都已经关闭。直接通过prompt下载很慢,并且经常会出现HTTPERROR导致下载失败。所以可以提前下载好压缩包,然后离线下载,这样就不容易出现下载到一半下载失败令人苦恼的情况。

2.1 安装Pytorch

Anaconda安装完成后,开始创建环境,这里以win10 系统为例。打开Anaconda Prompt:

# pytorch为环境名,这里创建python3.6版。
conda create - n pytorch python = 3.6
# 切换到pytorch环境
activate pytorch
# ***以下为1.0版本安装***
# 安装GPU版本,根据cuda版本选择cuda80,cuda92,如果cuda是9.0版,则不需要
# 直接conda install pytorch -c pytorch即可
# win下查看cuda版本命令nvcc -V
conda install pytorch cuda92 - c pytorch
# cpu版本使用
conda install pytorch-cpu -c pytorch

# torchvision 是torch提供的计算机视觉工具包,后面介绍
pip install torchvision

# *** 官方更新了1.01 所以安装方式也有小的变更
# torchversion提供了conda的安装包,可以用conda直接安装了
# cuda支持也升级到了10.0
# 安装方式如下:
# cpu版本
conda install pytorch - cpu torchvision - cpu - c pytorch
# GPU版
conda install pytorch torchvision cudatoolkit = 10.0 - c pytorch
# cudatoolkit后跟着相应的cuda版本
# 目前测试 8.0、9.0、9.1、9.2、10.0都可安装成功

验证输入python 进入

import torch
torch.__version__
# 得到结果'1.1.0'

2.2 配置 Jupyter Notebook

新建的环境是没有安装ipykernel的,所以无法注册到Jupyter Notebook中,所以先要准备下环境:

# 安装ipykernel
conda install ipykernel
# 写入环境
python -m ipykernel install  --name pytorch --display-name "Pytorch for Deeplearning"

下一步就是定制 Jupyter Notebook:

# 切换回基础环境
activate base
# 创建jupyter notebook配置文件
jupyter notebook --generate-config
## 这里会显示创建jupyter_notebook_config.py的具体位置

打开文件,修改

c.NotebookApp.notebook_dir = '' 默认目录位置
c.NotebookApp.iopub_data_rate_limit = 100000000 这个改大一些否则有可能报错

2.3 测试

至此 Pytorch 的开发环境安装完成,可以在开始菜单中打开Jupyter Notebook,在New 菜单中创建文件时选择Pytorch for Deeplearning,创建PyTorch的相关开发环境了

3-7章为官方网站的 Deep Learning with PyTorch: A 60 Minute Blitz 的中文翻译,目前在网上看到所有中文翻译版本都已经过时了,所以才又从新翻译了一遍,确保与官方同步。
此外,3-7章所有图片均来自于PyTorch官网,版权归PyTorch所有。

3、张量

%matplotlib inline

PyTorch是什么?

基于Python的科学计算包,服务于以下两种场景:

  • 作为NumPy的替代品,可以使用GPU的强大计算能力
  • 提供最大的灵活性和高速的深度学习研究平台

开始

Tensors(张量)

^^^^^^^

  • Tensors与Numpy中的 ndarrays类似,但是在PyTorch中
  • Tensors 可以使用GPU进行计算.
from __future__ import print_function
import torch

创建一个 5x3 矩阵, 但是未初始化:

x = torch.empty(5, 3)
print(x)

创建一个随机初始化的矩阵:

x = torch.rand(5, 3)
print(x)

创建一个0填充的矩阵:

x = torch.zeros(5, 3)
print(x)

创建一个0填充的矩阵,数据类型为long:

x = torch.zeros(5, 3, dtype=torch.long)
print(x)

创建tensor并使用现有数据初始化:

x = torch.tensor([5.5, 3])
print(x)

根据现有的张量创建张量。 这些方法将重用输入张量的属性,例如, dtype,除非设置新的值进行覆盖

x = x.new_ones(5, 3, dtype=torch.double)      # new_* 方法来创建对象
print(x)

x = torch.randn_like(x, dtype=torch.float)    # 覆盖 dtype!
print(x)                                      # 对象的size 是相同的,只是值和类型发生了变化

获取 size

译者注:使用size方法与Numpy的shape属性返回的相同,张量也支持shape属性,后面会详细介绍

print(x.size())
torch.Size([5, 3])


操作

^^^^^^^^^^

操作有多种语法。

我们将看一下加法运算。

加法1:

y = torch.rand(5, 3)
print(x + y)

加法2:

print(torch.add(x, y))

提供输出tensor作为参数

result = torch.empty(5, 3)
torch.add(x, y, out=result)
print(result)

替换

# adds x to y
y.add_(x)
print(y)


你可以使用与NumPy索引方式相同的操作来进行对张量的操作

print(x[:, 1])

torch.view: 可以改变张量的维度和大小

译者注:torch.view与Numpy的reshape类似

x = torch.randn(4, 4)
y = x.view(16)
z = x.view(-1, 8)  #  size -1 从其他维度推断
print(x.size(), y.size(), z.size())

如果你有只有一个元素的张量,使用.item()来得到Python数据类型的数值

x = torch.randn(1)
print(x)
print(x.item())

Read later:

100+ Tensor operations, including transposing, indexing, slicing, mathematical operations, linear algebra, random numbers, etc., are described here <https://pytorch.org/docs/torch>_.

100+张量操作,包括转置、索引、切片,数学运算、线性代数、随机数等,描述为“here https://pytorch.org/docs/torch”。

NumPy 转换

Converting a Torch Tensor to a NumPy array and vice versa is a breeze.

The Torch Tensor and NumPy array will share their underlying memory locations, and changing one will change the other.

Converting a Torch Tensor to a NumPy Array ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

将Torch Tensor转换成NumPy array,反之亦然,这是轻而易举的。
Torch Tensor和NumPy array将共享它们的底层内存位置,更改其中一个将更改另一个。
将Torch Tensor转换为NumPy array。

a = torch.ones(5)
print(a)

b = a.numpy()
print(b)

See how the numpy array changed in value.

a.add_(1)
print(a)
print(b)

NumPy Array 转化成 Torch Tensor

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

使用from_numpy自动转化

import numpy as np
a = np.ones(5)
b = torch.from_numpy(a)
np.add(a, 1, out=a)
print(a)
print(b)

所有的 Tensor 类型默认都是基于CPU, CharTensor 类型不支持到 NumPy 的转换.

CUDA 张量

使用.to 方法 可以将Tensor移动到任何设备中

# is_available 函数判断是否有cuda可以使用
# ``torch.device``将张量移动到指定的设备中
if torch.cuda.is_available():
    device = torch.device("cuda")          # a CUDA 设备对象
    y = torch.ones_like(x, device=device)  # 直接从GPU创建张量
    x = x.to(device)                       # 或者直接使用``.to("cuda")``将张量移动到cuda中
    z = x + y
    print(z)
    print(z.to("cpu", torch.double))       # ``.to`` 也会对变量的类型做更改
tensor([0.7632], device='cuda:0')
tensor([0.7632], dtype=torch.float64)

4、自动求导

%matplotlib inline

Autograd: 自动求导机制

PyTorch 中所有神经网络的核心是 autograd 包。我们先简单介绍一下这个包,然后训练第一个简单的神经网络。

autograd包为张量上的所有操作提供了自动求导。它是一个在运行时定义的框架,这意味着反向传播是根据你的代码来确定如何运行,并且每次迭代可以是不同的。

示例

张量(Tensor)

torch.Tensor是这个包的核心类。如果设置 .requires_gradTrue,那么将会追踪所有对于该张量的操作。 当完成计算后通过调用 .backward(),自动计算所有的梯度,这个张量的所有梯度将会自动积累到 .grad 属性。

要阻止张量跟踪历史记录,可以调用.detach()方法将其与计算历史记录分离,并禁止跟踪它将来的计算记录。

为了防止跟踪历史记录(和使用内存),可以将代码块包装在with torch.no_grad():中。在评估模型时特别有用,因为模型可能具有requires_grad = True的可训练参数,但是我们不需要梯度计算。

在自动梯度计算中还有另外一个重要的类Function.

Tensor and Function are interconnected and build up an acyclic graph, that encodes a complete history of computation. Each tensor has a .grad_fn attribute that references a Function that has created the Tensor (except for Tensors created by the user - their grad_fn is None).

TensorFunction互相连接并生成一个非循环图,它表示和存储了完整的计算历史。每个张量都有一个.grad_fn属性,这个属性引用了一个创建了TensorFunction(除非这个张量是用户手动创建的,即,这个张量的 grad_fnNone)。

如果需要计算导数,你可以在Tensor上调用.backward()。 如果Tensor是一个标量(即它包含一个元素数据)则不需要为backward()指定任何参数,但是如果它有更多的元素,你需要指定一个gradient 参数来匹配张量的形状。

译者注:在其他的文章中你可能会看到说将Tensor包裹到Variable中提供自动梯度计算,Variable 这个在0.4.1版中已经被标注为过期了,现在可以直接使用Tensor,官方文档在这里:

https://pytorch.org/docs/stable/autograd.html#variable-deprecated

具体的后面会有详细说明

import torch

创建一个张量并设置 requires_grad=True 用来追踪他的计算历史

x = torch.ones(2, 2, requires_grad=True)
print(x)

对张量进行操作:

y = x + 2
print(y)

结果y已经被计算出来了,所以,grad_fn已经被自动生成了。

print(y.grad_fn)

对y进行一个操作

z = y * y * 3
out = z.mean()

print(z, out)

.requires_grad_( ... ) 可以改变现有张量的 requires_grad 属性。 如果没有指定的话,默认输入的 flag 是 False。

a = torch.randn(2, 2)
a = ((a * 3) / (a - 1))
print(a.requires_grad)
print(a.grad_fn)

a.requires_grad_(True)

print(a.requires_grad)
b = (a * a).sum()
print(b.grad_fn)
False
None
True
<SumBackward0 object at 0x000002325360B438>

梯度

反向传播

因为 out是一个纯量(scalar),out.backward() 等于out.backward(torch.tensor(1))

out.backward()

print gradients d ( o u t ) / d x d(out)/dx d(out)/dx

print(x.grad)

得到矩阵 4.5.调用 out Tensor o o o”.

得到 o = 1 4 ∑ i z i o = \\frac14\\sum_i z_i o=41izi, z i = 3 ( x i + 2 ) 2 z_i = 3(x_i+2)^2 zi=3(xi+2)2 and z i ∣ x i = 1 = 27 z_i\\bigr\\rvert_x_i=1 = 27 zixi=1=27.

因此, ∂ o ∂ x i = 3 2 ( x i + 2 ) \\frac\\partial o\\partial x_i = \\frac32(x_i+2) xio=23(xi+2), 因此, ∂ o ∂ x i ∣ x i = 1 = 9 2 = 4.5 \\frac\\partial o\\partial x_i\\bigr\\rvert_x_i=1 = \\frac92 = 4.5 xioxi=1=29=4.5.

可以使用 autograd 做更多的操作

x = torch.randn(3, requires_grad=查看详情  

pytorch深度学习60分钟快速入门part0:系列介绍

 说明:本系列教程翻译自PyTorch官方教程《DeepLearningwithPyTorch:A60MinuteBlitz》 教程目标在高层次上理解PyTorch的Tensor库和神经网络训练一个小型的神经网络来分类图像前提条件假设读者熟悉基础的NumPy库确保已经安装了torch和t... 查看详情

参考《深度学习之pytorch实战计算机视觉》pdf

...三大应用方向。计算机视觉学习,推荐阅读《深度学习之PyTorch实战计算机视觉》。学到人工智能的基础概念及Python编程技能,掌握PyTorch的使用方法,学到深度学习相关的理论知识,比如卷积神经网络、循环神经网络、自动编码... 查看详情

分享《深度学习之pytorch(廖星宇著)》+《pytorch深度学习实战(侯宜军著)》+源代码

...资料分享:https://www.cnblogs.com/javapythonstudy/《深度学习之Pytorch(廖星宇著)》PDF,232页,带书签,文字可以复制粘贴。《PyTorch深度学习实战(侯宜军著)》PDF,121页,带书签,文字可以复制粘贴。配套源代码。如图: 查看详情

分享《深度学习之pytorch(廖星宇著)》+《pytorch深度学习实战(侯宜军著)》+源代码

...VbDVIoA更多资料分享:http://blog.51cto.com/3215120《深度学习之Pytorch(廖星宇著)》PDF,232页,带书签,文字可以复制粘贴。《PyTorch深度学习实战(侯宜军著)》PDF,121页,带书签,文字可以复制粘贴。配套源代码。如图: 查看详情

pytorch深度学习60分钟快速入门part3:神经网络

 神经网络可以通过使用torch.nn包来构建。既然你已经了解了autograd,而nn依赖于autograd来定义模型并对其求微分。一个nn.Module包含多个网络层,以及一个返回输出的方法forward(input)。例如,查看下图中的对数字图片分类的网络... 查看详情

pytorch深度学习60分钟快速入门part2:autograd自动化微分

 在PyTorch中,集中于所有神经网络的是autograd包。首先,我们简要地看一下此工具包,然后我们将训练第一个神经网络。autograd包为张量的所有操作提供了自动微分。它是一个运行式定义的框架,这意味着你的后向传播是由你... 查看详情

人工智能深度学习入门练习之(30)深度学习–人工神经网络

本章我们将从生物神经元开始学习人工神经网络。生物神经元哺乳动物的大脑有数十亿个神经元。神经元是人脑中相互连接的神经细胞。神经元参与处理和传递化学信号和电信号,它们接受信号输入,在细胞核中处理信号,如果... 查看详情

小白学习之pytorch框架-动手学深度学习(begin)

在这向大家推荐一本书-花书-动手学深度学习pytorch版,原书用的深度学习框架是MXNet,这个框架经过Gluon重新再封装,使用风格非常接近pytorch,但是由于pytorch越来越火,个人又比较执着,想学pytorch,好,有个大神来了,把《动... 查看详情

深度学习之pytorch实战——迁移学习

...(这篇博客其实很早之前就写过了,就是自己对当前学习pytorch的一个教程学习做了一个学习笔记,一直未发现,今天整理一下,发出来与前面基础形成连载,方便初学者看,但是可能部分pytorch和torchvision的API接口已经更新了,... 查看详情

(翻译)60分钟入门深度学习工具-pytorch(代码片段)

60分钟入门深度学习工具-PyTorch作者:SoumithChintala原文翻译自:一、Pytorch是什么?二、AUTOGRAD三、神经网络四、训练一个分类器五、数据并行他是一个基于Python的科学计算包,目标用户有两类为了使用GPU来替代numpy一个深度学习研... 查看详情

pytorch深度学习:60分钟入门(translation)

这是https://zhuanlan.zhihu.com/p/25572330的学习笔记。 TensorsTensors和numpy中的ndarrays较为相似,因此Tensor也能够使用GPU来加速运算。from__future__importprint_functionimporttorchx=torch.Tensor(5,3)#构造一个未初始化的5*3的矩阵x=torch.rand 查看详情

《深度学习与计算机视觉算法原理框架应用》pdf+《深度学习之pytorch实战计算机视觉》pdf

...下载:https://pan.baidu.com/s/1P0-o29x0ZrXp8WotN7GzcA《深度学习之PyTorch实战计算机视觉》更多分享:https://pan.baidu.com/s/1g4hv05UZ_w92uh9NNNkCaA《深度学习与计算机视觉算法原理框架应用》共13章,分为2篇。第1篇基础知识,介绍了人工智能发展... 查看详情

机器学习之深度学习入门(代码片段)

个人公众号yk坤帝获取更多学习资料,学习建议本文用浅显易懂的语言精准概括了机器学习的相关知识,内容全面,总结到位,剖析了机器学习的what,who,when,where,how,以及why等相关问题。从机器学习... 查看详情

全网最快掌握机器学习之深度学习之神经网络数学基础(附源代码)(代码片段)

...号yk坤帝后台回复机器学习获得源代码1.全文简介要理解深度学习,需要熟悉很多简单的数学概念:张量、张量运算、微分、梯度下降等。本文目的是用不那么技术化的文字帮你建立对这些概念的直觉。特别地,我们... 查看详情

linux快速入门打开你的学习之道

相信看到这篇文章的你一定是想要学习Linux,或者已经在学习Linux的人了,那我们就可以一起探讨一下,学习Linux如何快速入门呢?首先,希望大家弄清楚自己为什么要学习Linux,有的人是因为兴趣,有的人是因为Linux比较好找工... 查看详情

麦子深度学习之-机器学习算法高级进阶

麦子深度学习之-机器学习算法高级进阶随笔背景:在很多时候,很多入门不久的朋友都会问我:我是从其他语言转到程序开发的,有没有一些基础性的资料给我们学习学习呢,你的框架感觉一下太大了,希望有个循序渐进的教... 查看详情

分享《深度学习之pytorch实战计算机视觉》pdf

下载:https://pan.baidu.com/s/1Yhf2Pv0gy63VgiMQTglgXA更多分享资料:https://www.cnblogs.com/javapythonstudy/《深度学习之PyTorch实战计算机视觉》高清PDF,287页,带书签目录,文字可以复制。如图: 查看详情