title | math | date | categories | tags | ||||
---|---|---|---|---|---|---|---|---|
PyTorch学习笔记(1) |
true |
2023-07-16 14:30:26 -0700 |
|
|
- FloatTensor
- DoubleTensor
- ByteTensor
- IntTensor
- LongTensor
常用来表示 Loss
有三种方式:
- 给定内容生成一维张量
- 给定维度大小生成一维张量
- 从 np 中得到一维张量
常用于 Bias 神经元的偏置,和 Linear Input
dim、size() 和 shape 的区分。对于一个维度为 [2, 2] 这样的张量,它的:
- dim 为 2,也就是数学上的 Rank,秩;
- size() 和 shape 则返回这个张量的形状,size() 是方法,shape 是属性;
常用来表示带有 Batch 的 Linear Input,例如 [4, 784]
常用来表示带有 Batch 的 RNN Input,例如 [10, 20, 100],表示一句话有 10 个单词 W,我们送入 20 句话进行训练 Sentence,每个单词用个 100 长度的一维向量表示
常用来表示 CNN,例如 [b, c, h, w]
用 numel 方法,即 num of element
用 torch.FloatTensor 创建 Tensor:
- 当接收到一个 List,则根据现有数据创建 Tensor
- 当接收到不是 List,则根据维度创建 Tensor
- Torch.empty()
- Torch.FloatTensor(d1, d2, d3)
- Torch.IntTensor(d1, d2, d3)
NOT torch.FloatTensor([1, 2]) = torch.tensor([1, 2])
未初始化的数据会有很多极端值,如下,所以记得跟上后续步骤将数据覆盖掉
PyTorch 如果没有手动配置,默认会生成 FloatTensor
可以使用
torch.set_default_tensor_type(torch.DoubleTensor)
设置其他类型
-
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 只能采样整数
注意,arange 参数范围是 [0, 10),而 linspace 参数范围则是 [0, 10]
logspace 默认是以 10 为底数,可以通过 base 参数设置为 2,10,e 等
关键知识:
0:28:2
对应start:end:step
,不包含 end
data.index_select(0, torch.tensor([0, 2]))
,表示在第 0 个维度上,取 0 和 2 两个索引的数据
data.index_select(1, torch.tensor([1, 2]))
,表示在第 1 个维度上,取 1 和 2 两个索引的数据
当有 ... 出现时,右边的索引需要理解为最右边的维度。意思就是 ... 必须能被推测出代表哪几个维度才行
例如:
[0, ..., ::2]
和[0, :, :, ::2]
等价,... 只是简化写法罢了
缺点是会将索引后的数据打平。
只要保证 numel() 一致即可
数据的存储 / 维度顺序非常重要,需要时刻记住!
正数增加维度是在指定索引的前面增加;负数增加维度是在指定索引的后面增加
尽量不要使用负数增加维度,易混淆
参数取值在 [-a.dim() - 1, a.dim()],即 [-5, 4]
配合扩张 Broadcasting 操作,就可以很方便的给图像上的每个像素添加一个偏置了
不指定参数就将所有 dim 为 1 的维度删除
t() 只能用于二维张量
transpose() 可以指定参数交换指定维度
view 会导致维度顺序关系变得模糊,所以需要人为跟踪
[b, h, w, c] 是 Numpy 存储图片的格式,所以需要这一步才能到处 Numpy
permute 可以一步到位,直接调整多个维度的顺序
-
expand:broadcasting
- 不会主动复制数据,只有维度为 1 的才能扩张成其他维度
-
repeat:memory copied
- 会发生实实在在的内存拷贝
- 和 expand 参数区别是,repeat 参数指的是每一个维度要拷贝的次数