1. Intro

  • https://pytorch.org/docs/stable/tensors.html

  • Tensor是ML基本组成部分,用数字方式表示数据;

  • 如将图像表示为:具有形状(shape)[3,224,224]的张量,
    意味[color_channel,height,width],
    图像中有三种颜色(红色,绿色,蓝色),宽224像素,高224像素;

import torch
torch.__version__

# 输出:'2.3.0+cpu'

# 输出:2.2.1+cu121

2. Scalar

  • Scalar:标量,点,0维张量;

  • scalar as single number aka zero dimension tensor

  • 有大小,没方向,具体数据可表达,如重量,时间,长度,温度等;

# item:仅适应于单个元素的张量
scalar = torch.tensor(7)
scalar,scalar.ndim,scalar.item()

# 输出:(tensor(7), 0, 7)

3. Vector

  • Vector:向量,线,1维张量

  • vector as single dimension tensor but can contain many number;

  • 也称矢量,由大小和方向共同决定的量,如力和速度等;

  • 向量有两个维度:大小(箭头的长度)和方向(箭头所指的方向);

  • 如可用[3,2]表述房中的[bedroom,bathroom],
    或[3,2,2]表述[bedrooms,bathrooms,car_park];

  • 此向量包含两个数字,但只有一个维度,可通过外部方括号([)
    的数量来判断Pytorch中张量的维数,且只需计算一侧;

  • 另张量的另一个重要慨念:形状(shape)属性,表示内部元素是如何排列的;
    大小为2,即此向量的形状:方括号内放置了2个元素;

vector = torch.tensor([7, 7])
vector,vector.ndim,vector.shape

# 输出:(tensor([7, 7]), 1, torch.Size([2]))

4. Matrix

  • Matrix:矩阵,面,2维张量;

  • 按长方阵列排列的复数或实数集合,元素是实数的矩阵称为实矩阵,
    元素是复数的矩阵称为复矩阵,而行数与列数都等于n的矩阵称为n阶矩阵或n阶方阵;

  • m行n列的数称为m行n列的矩阵,简称m * n矩阵,记作:

matrix = torch.tensor([[7,8],[9,10]])
matrix,matrix.ndim,matrix.shape

# (tensor([[7, 8],[9,10]]),2,torch.Size([2,2]))
  • 矩阵有两个维度,即单侧有两个方括号;

  • 形状:大小为[2, 2],即宽度有两个元素,长度也有两个元素;

5. Tensor

  • Tensor:张量,体,三维张量,张量是多维数组,目的是能创造高维矩阵和向量;

  • multi-dimensional matrix containing single data type element;

  • 张量属性:rank:维度数量;shape:行和列的数量;type:张量的元素类型;

  • 张量可代表很多东西,想象excel中的表格,[1,3,3]:表示有一个3乘3的维度;

tensor = torch.tensor([[[1,2,3],[3,6,9],[2,4,5]]])
tensor,tensor.ndim,tensor.shape

# 输出:(tensor([[[1,2,3],[3,6,9],[2,4,5]]]),3,torch.Size([1,3,3]))

6. Summarization

  • 通常标量和向量用小写字母,如s和v,矩阵和张量用大写字母,如M和T

PytorchDifferentTensorDimension
ScalarVectorMatrixTensor

7. Random Tensor

  • 作为数据科学家,可定义ML模型如何启动(start,initialization),
    查看数据(look at,representation),更新(update,optimization)其随机数;

# 创建随机数张量
random_tensor = torch.rand(size=(3,4))
random_tensor,random_tensor.shape,random_tensor.ndim,random_tensor.dtype

(tensor([[0.2996, 0.7734, 0.3182, 0.0270],
         [0.9750, 0.5131, 0.1038, 0.9679],
         [0.2237, 0.1306, 0.6742, 0.3432]]),

torch.Size([3, 4]),2,torch.float32)

8. Zero and One

zero = torch.zeros(size=(3, 4))
zero,zero.dtype

(tensor([[0., 0., 0., 0.],
         [0., 0., 0., 0.],
         [0., 0., 0., 0.]]),
 torch.float32)
one = torch.ones(size=(3, 4))
one,one.dtype

(tensor([[1., 1., 1., 1.],
         [1., 1., 1., 1.],
         [1., 1., 1., 1.]]),
 torch.float32)

9. Range Tensor

  • torch.arange(start,end,step);

  • Python可通过range()创建范围,
    PyTorch中torch.range()已弃用,请使用torch.arange()

Entry Memo

start

范围的开始,如0

end

范围的结束,如10

step

每个值之间的步长,如1

range_deprecation = torch.range(0,10)
arange = torch.arange(start=0,end=10,step=1)
range_deprecation,arange
C:\Users\Administrator\AppData\Local\Temp\ipykernel_16092\3310502601.py:1:
	UserWarning: torch.range is deprecated and will be removed in a future
	release because its behavior is inconsistent with Python's range builtin.
	Instead, use torch.arange, which produces values in [start, end).
range_deprecation = torch.range(0,10)

(tensor([ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10.]),
 tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]))
  • 有时需特定类型的张量与另一张量具有相同的形状(shape);

  • 如一个全零的张量,其形状与前一个张量相同;

  • 可使用如torch.zeros_like(input)或torch.ones_like(input),
    分别返回填充与输入形状相同的零或一的张量;

zero_like_arange = torch.zeros_like(input=arange)
zero_like_arange

# 输出:tensor([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

10. Tensor Datatype

Bit Float Memo

16位浮点

torc.float16,torc.half

32位浮点

torch.foat32,torch.floot

64位浮点

torch.float64,torch.double

  • 一般看到torch.cuda,张量就用于GPU,因Nvidia GPU使用Cuda计算的工具包;

  • 最常见的类型(通常是默认类型)是32位浮点,
    但也有16位浮点和64位浮点,甚至还有8位,16位,32位,64位整数;

  • 整数如7,而浮点是小数,如7.0,这都与计算的精度(precision)有关,精度正比于数字的细节;

  • 这在DL和数值计算中很重要,精度低,计算速度快,但准确性accuracy等评估指标较低;

  • 创建特定数据类型的张量:

    • tensor默认数据类型:float32;即None,传torch.float32或torch.floot等;

    • device默认None;requires_grad:若true:则记录对张量执行的操作;

float_32_tensor = torch.tensor([3.0,6.0,9.0],dtype=None,device=None,requires_grad=False)
float_32_tensor.shape, float_32_tensor.dtype, float_32_tensor.device

# 输出:(torch.Size([3]),torch.float32,device(type='cpu'))
  • 除形状问题(张量形状不匹配(match)),另还有数据类型datatype和设备device问题;

  • 如A张量是torch.float32,B张量是torch.float16,A张量在CPU上,B张量在GPU上;

  • PyTorch最喜欢张量是相同的format(datatype),PyTorch最喜欢张量之间的计算在同一设备上;

# # torch.half也工作
float_16_tensor = torch.tensor([3.0,6.0,9.0],dtype=torch.float16)
float_16_tensor.dtype

# 输出:torch.float16