感谢大家的阅读
张量的简介以及基础操作
PyTorch中最基本的操作对象就是tensor,表示一个多维矩阵,比如0维矩阵就是一个点,一维矩阵就是向量,二维矩阵就是一般的矩阵,多维矩阵就相当于一个多维数组,这个numpy是对应的。
在运行以下代码前先导库:
import torch
import numpy as np
import random
张量的多种创建方法
已有数据创建张量
#已有数据创建张量
def test01():
# 1. 创建张量标量
data = torch.tensor(10)
print(data)
# 2. numpy 数组, 由于 data 为 float64, 下面代码也使用该类型
data = np.random.randn(2, 3)
data = torch.tensor(data)
print(data)
# 3. 列表, 下面代码使用默认元素类型 float32
data = [[10., 20., 30.], [40., 50., 60.]]
data = torch.tensor(data)
print(data)
test01()
运行结果如下:
创建指定形状的张量
# 2. 创建指定形状的张量
def test02():
# 1. 创建2行3列的张量, 默认 dtype 为 float32
data = torch.Tensor(2, 3)
print(data)
# 2. 注意: 如果传递列表, 则创建包含指定元素的张量
data = torch.Tensor([10])
print(data)
data = torch.Tensor([10, 20])
print(data)
test02()·
运行结果:
创建线性和随机张量
torch.arange 和 torch.linspace 创建线性张量
# 1. 创建线性空间的张量
def test01():
# 1. 在指定区间按照步长生成元素 [start, end, step)
data = torch.arange(0, 10, 2)
print(data)
# 2. 在指定区间按照元素个数生成
data = torch.linspace(0, 11, 10)
print(data)
test01()
运行结果:
张量元素类型转换
def test():
data = torch.full([2, 3], 10)
print(data.dtype)
# 将 data 元素类型转换为 float64 类型
# 1. 第一种方法
data = data.type(torch.DoubleTensor)
print(data.dtype)
# 转换为其他类型
# data = data.type(torch.ShortTensor)
# data = data.type(torch.IntTensor)
# data = data.type(torch.LongTensor)
# data = data.type(torch.FloatTensor)
# 2. 第二种方法
data = data.double()
print(data.dtype)
# 转换为其他类型
# data = data.short()
# data = data.int()
# data = data.long()
# data = data.float()
test()
张量与numpy互转
将张量转换为 numpy 数组
注意:两个变量共用内存,如果需要相互独立,可以使用copy函数拷贝一份。
def test01():
data_tensor = torch.tensor([2, 3, 4])
# 使用张量对象中的 numpy 函数进行转换
data_numpy = data_tensor.numpy()
print(type(data_tensor))
print(type(data_numpy))
# 注意: data_tensor 和 data_numpy 共享内存
# 修改其中的一个,另外一个也会发生改变
# data_tensor[0] = 100
data_numpy[0] = 100
print(data_tensor)
print(data_numpy)
test01()
numpy 转换为张量
使用 from_numpy 可以将 ndarray 数组转换为 Tensor,默认共享内存,使用 copy 函数避免共享
# 1. 使用 from_numpy 函数
def test01():
data_numpy = np.array([2, 3, 4])
data_tensor = torch.from_numpy(data_numpy)
# nunpy 和 tensor 共享内存
# data_numpy[0] = 100
data_tensor[0] = 100
print(data_tensor)
print(data_numpy)
test01()
使用 torch.tensor 可以将 ndarray 数组转换为 Tensor,默认不共享内存
# 2. 使用 torch.tensor 函数
def test02():
data_numpy = np.array([2, 3, 4])
data_tensor = torch.tensor(data_numpy)
# nunpy 和 tensor 不共享内存
# data_numpy[0] = 100
data_tensor[0] = 100
print(data_tensor)
print(data_numpy)
test02()
张量运算
张量基本运算
基本运算中,包括 add、sub、mul、div、neg 等函数, 以及这些函数的带下划线的版本 add_、sub_、mul_、div_、neg_,其中带下划线的版本为修改原数据。
以加法为例子:
rect1 = torch.tensor([ [1,2,3], [4,5,6] ])
rect2 = torch.tensor([ [1,2,3], [4,5,6] ])
rect1.add(rect2)
print("rect1 add",rect1)
rect1.add_(rect2)
print("rect1 _add",rect1)
# 补充
result = torch.add(rect1, rect2)
print("torch", result)
矩阵的点乘与乘积运算
点乘可以直接使用*也可以用上面的mul,乘积可以用@也可以用matmul
张量索引操作
简单行、列索引、范围索引
行列索引其实是范围索引的特列,他们类似于列表的切片
布尔索引
# 布尔索引
def test():
# 第三列大于5的行数据
print(data[data[:, 2] > 5])
# 第二行大于5的列数据
print(data[:, data[1] > 5])
if __name__ == '__main__':
test04()
张量形状操作
1.reshape 函数可以在保证张量数据不变的前提下改变数据的维度,将其转换成指定的形状。
2.transpose 函数可以实现交换张量形状的指定维度
3.permute 函数可以一次交换更多的维度。
4.squeeze 函数用删除 shape 为 1 的维度,unsqueeze 在每个维度添加 1, 以增加数据的形状。
张量拼接操作
torch.cat 函数可以将两个张量根据指定的维度拼接起来.
def test():
data1 = torch.randint(0, 10, [3, 5, 4])
data2 = torch.randint(0, 10, [3, 5, 4])
print(data1.shape)
print(data2.shape)
print('-' * 50)
# 1. 按0维度拼接
new_data = torch.cat([data1, data2], dim=0)
print(new_data.shape)
print('-' * 50)
# 2. 按1维度拼接
new_data = torch.cat([data1, data2], dim=1)
print(new_data.shape)
print('-' * 50)
# 3. 按2维度拼接
new_data = torch.cat([data1, data2], dim=2)
print(new_data.shape)
print('-' * 50)