Pytorch笔记搬运张量

网友投稿 532 2022-05-29

写在前面:踩坑指南

为什么安装conda后不能直接启动activate环境?

核心问题

在这个列表里选择可初始化的shell脚本

cmd.exe

作为shell name :

conda init cmd.exe

再输入

conda activate pytorch

就进入环境了

其实cmd给了我们提示了

2.1 张量

这次继续参与datawhale的看远学习,学习有关Pytorch,然后就把有关内容都自己码了一遍,加深理解和运用的功底。

进入到我们的jupyter lab

2.1.1 简介

几何代数中定义的张量是基于向量和矩阵的推广,比如我们可以将标量视为零阶张量,矢量可以视为一阶张量,矩阵就是二阶张量。

0维张量/标量 标量是一个数字

1维张量/向量 1维张量称为“向量”。

2维张量 2维张量称为矩阵

3维张量 公用数据存储在张量 时间序列数据 股价 文本数据 彩色图片(RGB)

张量是现代机器学习的基础。它的核心是一个数据容器,多数情况下,它包含数字,有时候它也包含字符串,但这种情况比较少。因此可以把它想象成一个数字的水桶。

这里有一些存储在各种类型张量的公用数据集类型:

3维 = 时间序列

4维 = 图像

5维 = 视频

例子:一个图像可以用三个字段表示:

(width, height, channel) = 3D

1

但是,在机器学习工作中,我们经常要处理不止一张图片或一篇文档——我们要处理一个集合。我们可能有10,000张郁金香的图片,这意味着,我们将用到4D张量:

(sample_size, width, height, channel) = 4D

1

在PyTorch中, torch.Tensor 是存储和变换数据的主要工具。如果你之前用过NumPy,你会发现 Tensor 和NumPy的多维数组非常类似。然而,Tensor 提供GPU计算和自动求梯度等更多功能,这些使 Tensor 这一数据类型更加适合深度学习。

2.1.2 创建tensor

在接下来的内容中,我们将介绍几种创建tensor的方法。

我们可以通过torch.rand()的方法,构造一个随机初始化的矩阵:

import torch x = torch.rand(4, 3) print(x)

1

2

3

Pytorch笔记搬运:张量

tensor([[0.7569, 0.4281, 0.4722], [0.9513, 0.5168, 0.1659], [0.4493, 0.2846, 0.4363], [0.5043, 0.9637, 0.1469]])

1

2

3

4

我们可以通过torch.zeros()构造一个矩阵全为 0,并且通过dtype设置数据类型为 long。

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

1

2

3

tensor([[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]])

1

2

3

4

我们可以通过torch.tensor()直接使用数据,构造一个张量:

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

1

2

3

tensor([5.5000, 3.0000])

1

基于已经存在的 tensor,创建一个 tensor :

x = x.new_ones(4, 3, dtype=torch.double) # 创建一个新的tensor,返回的tensor默认具有相同的 torch.dtype和torch.device # 也可以像之前的写法 x = torch.ones(4, 3, dtype=torch.double) print(x) x = torch.randn_like(x, dtype=torch.float) # 重置数据类型 print(x) # 结果会有一样的size # 获取它的维度信息 print(x.size()) print(x.shape)

1

2

3

4

5

6

7

8

9

10

tensor([[1., 1., 1.], [1., 1., 1.], [1., 1., 1.], [1., 1., 1.]], dtype=torch.float64) tensor([[ 2.7311, -0.0720, 0.2497], [-2.3141, 0.0666, -0.5934], [ 1.5253, 1.0336, 1.3859], [ 1.3806, -0.6965, -1.2255]]) torch.Size([4, 3]) torch.Size([4, 3])

1

2

3

4

5

6

7

8

9

10

返回的torch.Size其实是一个tuple,⽀持所有tuple的操作。

还有一些常见的构造Tensor的函数:

2.1.3 张量的操作

在接下来的内容中,我们将介绍几种常见的张量的操作方法:

加法操作:

import torch # 方式1 y = torch.rand(4, 3) print(x + y) # 方式2 print(torch.add(x, y)) # 方式3 提供一个输出 tensor 作为参数 # 这里的 out 不需要和真实的运算结果保持维数一致,但是会有警告提示! result = torch.empty(5, 3) torch.add(x, y, out=result) print(result) # 方式4 in-place y.add_(x) print(y)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

tensor([[ 2.8977, 0.6581, 0.5856], [-1.3604, 0.1656, -0.0823], [ 2.1387, 1.7959, 1.5275], [ 2.2427, -0.3100, -0.4826]]) tensor([[ 2.8977, 0.6581, 0.5856], [-1.3604, 0.1656, -0.0823], [ 2.1387, 1.7959, 1.5275], [ 2.2427, -0.3100, -0.4826]]) tensor([[ 2.8977, 0.6581, 0.5856], [-1.3604, 0.1656, -0.0823], [ 2.1387, 1.7959, 1.5275], [ 2.2427, -0.3100, -0.4826]]) tensor([[ 2.8977, 0.6581, 0.5856], [-1.3604, 0.1656, -0.0823], [ 2.1387, 1.7959, 1.5275], [ 2.2427, -0.3100, -0.4826]])

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

索引操作:(类似于numpy)

需要注意的是:索引出来的结果与原数据共享内存,修改一个,另一个会跟着修改。如果不想修改,可以考虑使用copy()等方法

# 取第二列 print(x[:, 1])

1

2

tensor([-0.0720, 0.0666, 1.0336, -0.6965])

1

y = x[0,:] y += 1 print(y) print(x[0, :]) # 源tensor也被改了了

1

2

3

4

tensor([3.7311, 0.9280, 1.2497]) tensor([3.7311, 0.9280, 1.2497])

1

2

改变大小:如果你想改变一个 tensor 的大小或者形状,你可以使用 torch.view:

x = torch.randn(4, 4) y = x.view(16) z = x.view(-1, 8) # -1是指这一维的维数由其他维度决定 print(x.size(), y.size(), z.size())

1

2

3

4

torch.Size([4, 4]) torch.Size([16]) torch.Size([2, 8])

1

注意 view() 返回的新tensor与源tensor共享内存(其实是同一个tensor),也即更改其中的一个,另 外一个也会跟着改变。(顾名思义,view仅仅是改变了对这个张量的观察⻆度)

x += 1 print(x) print(y) # 也加了了1

1

2

3

tensor([[ 1.3019, 0.3762, 1.2397, 1.3998], [ 0.6891, 1.3651, 1.1891, -0.6744], [ 0.3490, 1.8377, 1.6456, 0.8403], [-0.8259, 2.5454, 1.2474, 0.7884]]) tensor([ 1.3019, 0.3762, 1.2397, 1.3998, 0.6891, 1.3651, 1.1891, -0.6744, 0.3490, 1.8377, 1.6456, 0.8403, -0.8259, 2.5454, 1.2474, 0.7884])

1

2

3

4

5

6

所以如果我们想返回一个真正新的副本(即不共享内存)该怎么办呢?Pytorch还提供了一 个 reshape() 可以改变形状,但是此函数并不能保证返回的是其拷贝,所以不推荐使用。推荐先用 clone 创造一个副本然后再使用 view 。

注意:使用 clone 还有一个好处是会被记录在计算图中,即梯度回传到副本时也会传到源 Tensor 。

如果你有一个元素 tensor ,使用 .item() 来获得这个 value:

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

1

2

3

4

1

2

PyTorch中的 Tensor 支持超过一百种操作,包括转置、索引、切片、数学运算、线性代数、随机数等等,可参考官方文档。

2.1.4 广播机制

当对两个形状不同的 Tensor 按元素运算时,可能会触发广播(broadcasting)机制:先适当复制元素使这两个 Tensor 形状相同后再按元素运算。

x = torch.arange(1, 3).view(1, 2) print(x) y = torch.arange(1, 4).view(3, 1) print(y) print(x + y)

1

2

3

4

5

tensor([[1, 2]]) tensor([[1], [2], [3]]) tensor([[2, 3], [3, 4], [4, 5]])

1

2

3

4

5

6

7

由于 x 和 y 分别是1行2列和3行1列的矩阵,如果要计算 x + y ,那么 x 中第一行的2个元素被广播 (复制)到了第二行和第三行,⽽ y 中第⼀列的3个元素被广播(复制)到了第二列。如此,就可以对2 个3行2列的矩阵按元素相加。

手写一遍,收获会更多。

pytorch TensorFlow 机器学习

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:[跟着官方文档学pytest][五][学习笔记]
下一篇:伪共享和Java缓存行
相关文章