# Pytorch **Repository Path**: fakerlove/pytorch ## Basic Information - **Project Name**: Pytorch - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-10-04 - **Last Updated**: 2022-05-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Pytorch学习 > **[https://www.bilibili.com/video/BV1WS4y1r7d7学习视频](https://www.bilibili.com/video/BV1WS4y1r7d7)** > > [学习视频代码在NLPCode下面](NLPnote) > > [我写的代码链接](code) > > > > **第一章** > > 着重讲解pytorch 的基本安装,pytorch张量的基础使用 > > **[第二章](2-基础模型.md)** > > 讲解一下pytorch 常见api的调用, > > 还有使用pytorch 加载常见数据集,比如minist > > pytorch 完成线性回归 > > pytorch 完成 手写数字的识别 > > > > **[第三章](3-RNN.md)** > > RNN 就是使用 > > 主要使用RNN模型,来实现文本情感类分析 > > 主要有 文本情感类的数据准备,包括(分词,把英文字符串转换为 数字) > > 使用lstm对文本进行分析 下面进行第一章的讲解 # 1. 入门 ## 1.1 安装环境 ### 1.1.1 安装conda ### 1.1.2 安装cuda [CUDA Toolkit Archive | NVIDIA Developer](https://developer.nvidia.com/cuda-toolkit-archive)。点击进入页面 ![image-20220220162008278](picture/image-20220220162008278.png) 点击下载安装2.7G左右,下载很快的。 安装结束后,检查 ![image-20220220162306867](picture/image-20220220162306867.png) ![image-20220220162343242](picture/image-20220220162343242.png) ![image-20220220162400255](picture/image-20220220162400255.png) 差不多就安装成功了 ### 1.1.3 安装pytorch [pytorch.org](https://pytorch.org/) ![image-20220220162055434](picture/image-20220220162055434.png) 选择自己安装的版本型号,和自己的平台。然后复制命令行,运行即可。 记得添加国内镜像,比如清华的 测试使用 ~~~python import torch print(torch.cuda.is_available()) ~~~ 返回True,则表示torch安装成功,cuda安装成功 ## 1.2 基本知识 [课程视频](https://www.bilibili.com/video/BV1WS4y1r7d7) 课程教案也在当前目录下 ### 1.2.1 张量Tensor 要介绍Tensor这个数据类型,我觉得有必要扯一下数学。 我们都知道: 标量(Scalar)是只有大小,没有方向的量,如1,2,3等 向量(Vector)是有大小和方向的量,其实就是一串数字,如(1,2) 矩阵(Matrix)是好几个向量拍成一排合并而成的一堆数字,如[1,2;3,4] **那么张量(Tensor)是什么呢**?呵呵呵呵!大家估计也能猜出来!是按照三维排列的一堆数字? 是的。但是也不完全正确。 其实标量,向量,矩阵它们三个也是张量,标量是零维的张量,向量是一维的张量,矩阵是二维的张量。 * 常数scaler,0阶张量 * 向量,vector:1阶张量 * 矩阵,matrix:2阶张量 ~~~python import torch x = torch.Tensor(2,3) # 构造一个2x3的矩阵,没初始化但仍然会有值 print(x) y=torch.Tensor(4,2,3) print(y) ~~~ ![image-20220220162711816](picture/image-20220220162711816.png) #### 1. tensor创建方法 | 方法名 | 内容 | | | ------------------ | ---------- | ---- | | torch.Tensor() | | | | torch.empty(3,4) | 创建3,4 | | | torch.zeros([3,4]) | 剩 | | | torch.rand([3,4]) | 生成随机数 | | | torch.ones() | | | **创建空数组** ~~~python import torch print(torch.empty(3,4)) print(torch.ones([3,4]))# 创建全为1的tensor print(torch.zeros([3,4]))# 创建全为0 的tensor print(torch.rand([3,4])) ~~~ **创建任意数** ~~~python torch.randint(low=0,high=3,size=[3,4]) # low是最低值,3是最大值,size是范围大小 ~~~ #### 2. tensor常用方法 | 方法名 | 内容 | | | ----------------- | ---------------------- | ---- | | tensor.t() | 转置 | | | tensor.dim() | 获取阶数 | | | tensor.size() | 获取tensor的大小 | | | tensor.view() | 改变tensor的形状大小, | | | torch.rand([3,4]) | 生成随机数 | | | tensor.max() | 获取最大值 | | | tensor.min() | | | | tensor.permute() | 维度的置换 | | **张量属性** ~~~python t1=torch.Tensor([3,4]) print(t1) print(t1.item()) ~~~ ![image-20220221152424081](picture/image-20220221152424081.png) **测试** ```python t2=torch.Tensor([3]) print(t2.item()) ``` **形状改变,tensor.view((2,3)),类似于numpy中的reshape(),是一种浅拷贝,仅仅是形状发生改变** ~~~python t1 = torch.Tensor([[1, 2, 3], [4, 5, 6]]) print(t1.size()) t2 = t1.view((3, 2)) print(t2.size()) t1[1][1] = 100 print(t1) # 浅拷贝,t1改变,t2也随之改变 print(t2) ~~~ ![image-20220221155859810](picture/image-20220221155859810.png) **维数的置换** ~~~python import torch import numpy as np a=np.array([[[1,2,3],[4,5,6]]]) unpermuted=torch.tensor(a) print(unpermuted.size()) # ——> torch.Size([1, 2, 3]) permuted=unpermuted.permute(2,0,1) print(permuted.size()) # ——> torch.Size([3, 1, 2]) ~~~ #### 3. Tensor和numpy相互转化 ~~~python import numpy as np a=np.array([[1,2,3],[4,5,6]]) print(torch.Tensor(a)) ~~~ #### 4. tensor的数据类型 ![image-20220221170726047](picture/image-20220221170726047.png) ~~~python # 为double类型 t5=torch.DoubleTensor([2,3,3,5]) print(t5) # 整形 a=torch.IntTensor((2,4)) print(a) b=torch.ones([3,2],dtype=torch.float32) print(b) # 强转,把 b的浮点型,转换成c的int类型 c=b.int() print(c.dtype) ~~~ 结果 ~~~bash tensor([2., 3., 3., 5.], dtype=torch.float64) tensor([2, 4], dtype=torch.int32) tensor([[1., 1.], [1., 1.], [1., 1.]]) torch.int32 ~~~ #### 5. Tensor和tensor的区别 **torch.Tensor()** torch.Tensor()是Python类,更明确的说,是默认张量类型torch.FloatTensor()的别名,torch.Tensor([1,2]) 会调用Tensor类的构造函数__init__,生成单精度浮点类型的张量。 ~~~python >>> a=torch.Tensor([1,2]) >>> a.type() 'torch.FloatTensor' ~~~ **torch.tensor()** torch.tensor()仅仅是Python的函数,函数原型是: ~~~python torch.tensor(data, dtype=None, device=None, requires_grad=False) ~~~ 其中data可以是:list, tuple, array, scalar等类型。 torch.tensor()可以从data中的数据部分做拷贝(而不是直接引用),根据原始数据类型生成相应的torch.LongTensor,torch.FloatTensor,torch.DoubleTensor。 ~~~python >>> a = torch.tensor([1, 2]) >>> a.type() 'torch.LongTensor' >>> a = torch.tensor([1., 2.]) >>> a.type() 'torch.FloatTensor' >>> a = np.zeros(2, dtype=np.float64) >>> a = torch.tensor(a) >>> a.type() torch.DoubleTensor ~~~ tensor.data和tensor一般没有区别,但是在计算梯度的时候会有点区别。 tensor.data是获取tensor中的数据 ~~~python a=torch.ones([2,3],requires_grad=True) print(a) print(a.data) ~~~ tensor.numpy() reqquire_grad=True不能厚直接转换,需要使用tensor.detach().numpy()能够实现对tensor中的数据进行深度拷贝,转换为ndarray类型 ### 1.2.2 tensor的运算 #### Tensor的加法(四种) ~~~python a=torch.rand(5,3) b=torch.rand(5,3) print(a+b) print(torch.add(a,b)) result = torch.Tensor(5,3) print(torch.add(a,b,out=result)) print(b.add_(a)) ~~~ ![image-20220220163155801](picture/image-20220220163155801.png) **互换** ~~~python import numpy as np t3=torch.Tensor(np.arange(24).reshape((2,3,4))) print(t3.size()) print(t3) t4=t3.transpose(0,1) print(t4.size()) print(t4) ~~~ ![image-20220221163333761](picture/image-20220221163333761.png) ### 1.3 使用gpu加速 ~~~python import torch device=torch.device("cuda") a=torch.zeros([2,3],device=device) print(a) ~~~ 结果 ~~~bash tensor([[0., 0., 0.], [0., 0., 0.]], device='cuda:0') ~~~ 另一种 ~~~python # 这种写法也可以转到gpu b=torch.zeros([2,3]) b.to(device) ~~~ ## 1.4 torchvision和torch的关系 很多基于Pytorch的工具集都非常好用,比如处理自然语言的**torchtext**,处理音频的**torchaudio**,以及处理图像视频的**torchvision**。 torchvision包含一些常用的数据集、模型、转换函数等等。当前版本0.5.0包括图片分类、语义切分、目标识别、实例分割、关键点检测、视频分类等工具,它将mask-rcnn功能也都包含在内了。mask-rcnn的Pytorch版本最高支持torchvision 0.2.*,0.3.0之后mask-rcnn就包含到tensorvision之中了。