SCDN博客: https:// blog.csdn.net/weixin_41 923658
掘金:汤姆鱼 的个人主页 - 掘金
简书:汤姆鱼 - 简书
微信公众号:「汤姆鱼」
-------------------------------------手动分割线-------------------------------------------
1、张量(Tensor)
张量的英文是 Tensor, 它是 PyTorch 里基础的运算单位, 与 Numpy 的 ndarray 相同表示的是一个多维矩阵。与 ndarray 的最大区别就在于,PyTorch 的 Tensor 可以在 GPU 上运行,而 numpy 的 ndarray 只能在 CPU 上运行,在 GPU 上运行大大加快了运算速度。
(1)、首先要引入相关的包;
(2)、生成一个简单的张量;
注:rand() 函数的作用:
以给定的形状(取决于 rand函数的参数设置)创建一个数组,并在数组中加入在[0, 1] 之间均匀分布的随机样本。
与randn() 函数的区别:
randn() 函数以给定的形状创建一个数组,数组元素符合标准正态分布(0, 1)。
(3)、查看张量(矩阵)的大小;
a、可以使用shape属性查看;
x.shape;
b、可以使用size()函数,返回结果;
x.size();
张量 (Tensor) 是一个定义在一些向量空间和一些对偶空间的笛卡尔积上的多重线性映射,其坐标是 [n] 维空间内,有 [n] 个分量的一种量,其中每个分量都是坐标的函数,而在坐标变换时,这些分量也依照某些规则做线性变换。 R 称为该张量的秩或阶 (与矩阵的秩和阶均无关系)。
(4)、生成一些多维的张量;
解释:
- torch.rand(2, 3, 4, 5) 生成的多维矩阵,你可以把它想象成一个文件夹下面存放了一些图片,究竟是什么样的图片呢?数量有多少?
2 --- 表示这个文件夹里面存放图片的数量;
3 --- 表示这张图片的通道数,比如(R、G、B);
4, 5 --- 表示这张图片的大小 4 *5;
- 在同构的意义下,第零阶张量 (r = 0) 为标量(Scalar), 第一阶张量 (r =1) 为向量(vector) ,第二阶张量( r = 2)为 矩阵,第三阶以上的统称为多维张量。
理解:
r = 0, 标量(Scalar)其实就是一个实数,如 a, b….
r = 1, 向量(Vector) 又称为矢量,是一个一维数组,如 x =
r = 2, 矩阵(matrix)是一个二维数组,如 x =
r = 3 , 张量其实就是标量、向量和矩阵在多维空间( r >= 3) 中的推广,即多维数组。如: x =
(5)、生成一个标量;
对于标量直接使用 .item() 从中取出对应 的 python 对象的数值
(6)、生成一个元素的张量;
ps: 注意对比生成标量和生成一个元素张量的不同
对于只有一个元素的张量也可以使用 .item() 取 Python 对象的值
2、基本类型
- 整型:
64位:torch.LongTensor.
将 tensor 转换成 64 位整型
32位:torch.FloatTensor.
将 tensor 转换成 32 位整型
16位:torch.IntTensor.
将 tensor 转换成 16 位整型
- 浮点型:
64位: torch.DoubleTensor.
将 tensor 转换成 64 位浮点型
32位 :torch.FloatTensor.
将 tensor 转换成 32 位 浮点型
- Char 字符型:torch.CharTensor.
将 tensor 转换成 char 型
- byte 字节型:torch. ByteTensor.
将 tensor 转换成 byte 型
3、Numpy 转换
- 使用 numpy 方法将 Tensor 转化为 ndarray
- 将 numpy 转化成 Tensor
Tensor 和 numpy 对象共享内存,所以他们之间的转换很快,而且几乎不会消耗什么资源。但这也意味着,如果其中一个变了,另外一个也会随之改变。
4、设备间的转换
一般情况下可以使用 cuda 方法将 tensor 移动到 gpu, 这步操作需要 cuda 设备支持
- 在 cpu 上随机生成一个数组,并在数组中加入 [0,1] 之间的均匀分布随机样本
- 将 tensor 从 cpu 上移动到 gpu 上
- 使用 .cpu() 方法将 tensor 移动到 cpu 上
5、初始化
- 初始化,使用 [0,1] 均匀分布随机初始化二位数组
- 初始化,使用 1 填充
- 初始化,使用 0 填充
- 初始化,对角线为 1,其他为 0
6、张量操作常用方法
PyTorch 中对张量的操作 api 和 Numpy 非常相似,如果熟悉 Numpy 中的操作,那么他们二者基本一致;
- 生成标准的正态分布的二维数组
- 沿着行取最大值
- 每行求和
- 矩阵 a + b
- 以 _ 为结尾的,均会改变调用值