📀PyTorch是一个开源的深度学习框架,由Facebook的人工智能研究团队开发,专为深度学习研究和开发而设计。PyTorch 中的张量就是元素为同一种数据类型的多维矩阵。在 PyTorch 中,张量以 "类" 的形式封装起来,对张量的一些运算、处理的方法被封装在类中。
基本创建方式
- torch.tensor 根据指定数据创建张量
- torch.Tensor 根据形状创建张量, 其也可用来创建指定数据的张量
- torch.IntTensor、torch.FloatTensor、torch.DoubleTensor 创建指定类型的张量
import torch data = [1, 2, 3] tensor = torch.tensor(data) print(tensor)
import torch shape = (2, 3) tensor = torch.Tensor(*shape) print(tensor)
import torch int_tensor = torch.IntTensor([1, 2, 3]) float_tensor = torch.FloatTensor([1.0, 2.0, 3.0]) double_tensor = torch.DoubleTensor([1.0, 2.0, 3.0]) print(int_tensor) print(float_tensor) print(double_tensor)
创建线性和随机张量
- torch.arange 和 torch.linspace 创建线性张量
- torch.random.init_seed 和 torch.random.manual_seed 随机种子设置
- torch.randn 创建随机张量
import torch
start = 0
end = 10
step = 2
linear_tensor = torch.arange(start, end, step)
print(linear_tensor)
import torch
start = 0
end = 1
steps = 5
linear_tensor = torch.linspace(start, end, steps)
print(linear_tensor)
创建01张量
- torch.ones 和 torch.ones_like 创建全1张量
- torch.zeros 和 torch.zeros_like 创建全0张量
- torch.full 和 torch.full_like 创建全为指定值张量
import torch shape = (3, 3) zero_tensor = torch.zeros(*shape) print(zero_tensor) shape = (3, 3) one_tensor = torch.ones(*shape) print(one_tensor)
张量元素类型转换
- tensor.type(torch.DoubleTensor)
- torch.double()
import torch tensor = torch.FloatTensor([1, 2, 3]) double_tensor = tensor.type(torch.DoubleTensor) print(double_tensor) tensor = torch.FloatTensor([1, 2, 3]) double_tensor = torch.double(tensor) print(double_tensor)
阿达玛积
阿达玛积指的是矩阵对应位置的元素相乘;
阿达玛积是对两个矩阵或张量对应位置上的元素进行相乘,这种操作在神经网络中常用于权重的调整或其他逐元素的变换。要进行阿达玛积运算,两个矩阵或张量的维度必须相匹配,即它们必须有相同的形状。这是进行阿达玛积的前提条件。阿达玛积满足乘法的结合律、左分配律和右分配律,这些性质使得它在数学推导和算法设计中非常有用。在深度学习中,阿达玛积常用于激活函数的计算、权重更新以及在一些特定的层中,如注意力机制中的权重计算等。与矩阵乘法不同,阿达玛积不是基于矩阵的行和列的乘法,而是基于单个元素的乘法。这使得阿达玛积在某些情况下更为直观和易于理解。
import numpy as np import torch def test(): data1 = torch.tensor([[1, 2], [3, 4]]) data2 = torch.tensor([[5, 6], [7, 8]]) data = torch.mul(data1, data2) print(data) print('-' * 50) data = data1 * data2 print(data) print('-' * 50) if __name__ == '__main__': test()
程序输出结果
tensor([[ 5, 12], [21, 32]])
tensor([[ 5, 12], [21, 32]])
张量数值计算
📀PyTorch 计算的数据都是以张量形式存在, 我们需要掌握张量各种运算。我们可以在 CPU 中运算, 也可以在 GPU 中运算。
- CPU上创建张量
import torch tensor_cpu = torch.tensor([1, 2, 3])
- 在 GPU 上创建张量(如果 GPU 可用):
tensor_gpu = tensor_cpu.to('cuda')
PyTorch 默认会将张量创建在 CPU 控制的内存中, 即: 默认的运算设备为 CPU。我们也可以将张量创建在 GPU 上, 能够利用对于矩阵计算的优势加快模型训练。将张量移动到 GPU 上有如下方法: 1. 使用 cuda 方法 2. 直接在 GPU 上创建张量 3. 使用 to 方法指定设备。
张量的基本运算包括多种操作:
- 加法和减法:两个同阶张量可以进行元素对元素的加法和减法运算。
- 标量乘法:一个标量可以与任何阶的张量相乘,结果是将原张量的每个元素乘以该标量。
- 点积(内积):两个张量的点积通常是指它们之间的逐元素乘法后求和。
- 外积:两个向量的外积会产生一个矩阵,其中每个元素是第一个向量的元素与第二个向量的元素的乘积。
- 张量积(Kronecker积):用于组合两个张量来创建一个新的高阶张量。
- 特定运算:包括对称张量的运算、反对称张量的运算、迹运算等。
以下是使用 PyTorch 进行张量基本运算的代码案例:
import torch x = torch.tensor([1, 2, 3]) y = torch.tensor([4, 5, 6]) result_add = torch.add(x, y) print("Addition:", result_add) result_sub = torch.sub(x, y) print("Subtraction:", result_sub) result_mul = torch.mul(x, y) print("Multiplication:", result_mul) result_div = torch.div(x, y) print("Division:", result_div) result_neg = torch.neg(x) print("Negation:", result_neg) x.add_(y) print("Inplace Addition:", x) x.sub_(y) print("Inplace Subtraction:", x) x.mul_(y) print("Inplace Multiplication:", x) x.div_(y) print("Inplace Division:", x) x.neg_() print("Inplace Negation:", x)