Skip to content

Latest commit

 

History

History
253 lines (148 loc) · 6.7 KB

PyTorch学习笔记(1).md

File metadata and controls

253 lines (148 loc) · 6.7 KB
title math date categories tags
PyTorch学习笔记(1)
true
2023-07-16 14:30:26 -0700
人工智能
机器学习修炼之PyTorch
PyTorch

基本数据类型

基本数据类型

image

常用类型

  • FloatTensor
  • DoubleTensor
  • ByteTensor
  • IntTensor
  • LongTensor

标量

image

image

常用来表示 Loss

一维张量

image

image​​

有三种方式:

  • 给定内容生成一维张量
  • 给定维度大小生成一维张量
  • 从 np 中得到一维张量

常用于 Bias 神经元的偏置,和 Linear Input

二维张量

dim、size() 和 shape 的区分。对于一个维度为 [2, 2] 这样的张量,它的:

  • dim 为 2,也就是数学上的 Rank,秩;
  • size() 和 shape 则返回这个张量的形状,size() 是方法,shape 是属性;

image

常用来表示带有 Batch 的 Linear Input,例如 [4, 784]

三维张量

image

常用来表示带有 Batch 的 RNN Input,例如 [10, 20, 100],表示一句话有 10 个单词 W,我们送入 20 句话进行训练 Sentence,每个单词用个 100 长度的一维向量表示

四维张量

image

常用来表示 CNN,例如 [b, c, h, w]

获取张量的大小

用 numel 方法,即 num of element

image

创建 Tensor

创建 Tensor

用 torch.FloatTensor 创建 Tensor:

  • 当接收到一个 List,则根据现有数据创建 Tensor
  • 当接收到不是 List,则根据维度创建 Tensor

image

创建未初始化的 Tensor

  • Torch.empty()
  • Torch.FloatTensor(d1, d2, d3)
  • Torch.IntTensor(d1, d2, d3)

NOT torch.FloatTensor([1, 2]) = torch.tensor([1, 2])

未初始化的数据会有很多极端值,如下,所以记得跟上后续步骤将数据覆盖掉

image

PyTorch 如果没有手动配置,默认会生成 FloatTensor

可以使用 torch.set_default_tensor_type(torch.DoubleTensor)​ 设置其他类型

image

创建均匀分布的 Tensor

  • rand

    • 随机从 [0, 1] 分布中生成数据
  • rand_like

    • 接收一个 tensor,读取 tensor 的 shape,再送到 rand 函数
  • randint

    • 四个参数,例如 randint(1, 10, 3, 3),生成 [1, 10) 范围内的 3 x 3 的张量

均匀采用 0 ~ 10 的 Tensor,要用 x = 10 * torch.rand(d1, d2),randint 只能采样整数

image

创建正态分布的 Tensor

image

创建指定值的 Tensor

image

创建递增/递减的 Tensor

image

创建等间距的 Tensor

注意,arange 参数范围是 [0, 10),而 linspace 参数范围则是 [0, 10]

image

logspace 默认是以 10 为底数,可以通过 base 参数设置为 2,10,e 等

创建特殊的 Tensor

image

image

创建随机打散的 Tensor

image

image

索引和切片

关键知识:0:28:2​ 对应 start:end:step​,不包含 end

索引前/后 N 个

image

隔行索引

image

指定索引采样

data.index_select(0, torch.tensor([0, 2]))​,表示在第 0 个维度上,取 0 和 2 两个索引的数据

data.index_select(1, torch.tensor([1, 2]))​,表示在第 1 个维度上,取 1 和 2 两个索引的数据

image

...的使用

当有 ... 出现时,右边的索引需要理解为最右边的维度。意思就是 ... 必须能被推测出代表哪几个维度才行

例如:[0, ..., ::2]​ 和 [0, :, :, ::2]​ 等价,... 只是简化写法罢了

image

根据掩码索引

缺点是会将索引后的数据打平。

image

image

维度变换

view / reshape 维度变换

只要保证 numel() 一致即可

数据的存储 / 维度顺序非常重要,需要时刻记住!

image

squeeze / unsqueeze 删减维度 / 增加维度

unsqueeze 增加维度

正数增加维度是在指定索引的前面增加;负数增加维度是在指定索引的后面增加

尽量不要使用负数增加维度,易混淆

参数取值在 [-a.dim() - 1, a.dim()],即 [-5, 4]

image

​​image

配合扩张 Broadcasting 操作,就可以很方便的给图像上的每个像素添加一个偏置了

squeeze 删减维度

不指定参数就将所有 dim 为 1 的维度删除

image

transpose / t / permute 维度转置

t() 只能用于二维张量

transpose() 可以指定参数交换指定维度

view 会导致维度顺序关系变得模糊,所以需要人为跟踪

image

image

[b, h, w, c] 是 Numpy 存储图片的格式,所以需要这一步才能到处 Numpy

permute 可以一步到位,直接调整多个维度的顺序

image

expand / repeat 维度扩展

  • expand:broadcasting

    • 不会主动复制数据,只有维度为 1 的才能扩张成其他维度
  • repeat:memory copied

    • 会发生实实在在的内存拷贝
    • 和 expand 参数区别是,repeat 参数指的是每一个维度要拷贝的次数

image

image