Environment
- OS: macOS Mojave
- Python version: 3.7
- PyTorch version: 1.4.0
- IDE: PyCharm
文章目录
0. 写在前面
本文记录了 PyTorch 中对张量对象(torch.Tensor)的基本操作,包括创建和变换。
形式上,
- 向量是一维张量,如每个样本实例对应的标签可以表示为一个 ( L , ) (L,) (L,) 的张量
- 矩阵是二维张量,如灰度图通常为一个 ( H , W ) (H, W) (H,W) 的张量
- 还有三维及三维以上,如彩色图通常表示为一个 ( C , H , W ) (C, H, W) (C,H,W) 的张量
看了看定义上的一些具体区别,二阶张量与矩阵的区别与联系是什么?
1. Tensor 对象创建
torch.Tensor 是 PyTorch 中的运算对象,类似于 NumPy 中的 numpy.ndarray。
1.1 由其他数据类型创建
torch.tensor()
由 list 或 numpy.ndarray 得到
ls = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
tensor = torch.tensor(
data=ls, # 传入list或numpy.ndarray
dtype=None, # 数据类型,None时默认与data的数据类型一致
device='cpu', # 所在设备,None默认为cpu,可以传入'cuda'(实际中用 .to(device) 方法居多)
requires_grad=False, # 是否需要计算梯度
pin_memory=False # 是否存于锁页内存,与CPU到GPU的转换效率有关,数据量大时可以尝试为True,据说与设备有关
)
print(type(tensor))
# <class 'torch.Tensor'>
torch.from_numpy()
由 numpy.ndarray 得到,修改一个时,另一个也会改变
import numpy as np
import torch
array = np.array([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
])
tensor = torch.from_numpy(array)
# 注意,使用 id 获得两者的地址却是不一样的
print(id(array), id(tensor))
# 4352475504 4351190144
array[0][0] = 666
print(tensor)
# tensor([[666, 2, 3],
# [ 4, 5, 6],
# [ 7, 8, 9]])
1.2 按指定的数值创建
torch.zeros()
和torch.zeros_like()
创建值全为 0 0 0 的张量
tensor = torch.zeros(
(3, 3), # size,张量的形状,如(5, 3)、(3, 299, 299)
out=None,
dtype=None,
layout=torch.strided, # 内存中的布局形式,有strided,sparse_coo
device=None,
requires_grad=False
)
torch.ones()
和torch.ones_like()
创建值全为 1 1 1 的张量
tensor = torch.ones((3, 3))
torch.full()
和torch.full_like()
创建值全为fill_value
的张量
tensor = torch.full_like(array, fill_value=6)
torch.eye()
创建主对角线元素为 1 1 1 的二维张量
tensor = torch.eye(
n=3, # 矩阵行数
m=5, # 矩阵列数,不设置时得到一个方阵
)
print(tensor)
# tensor([[1., 0., 0., 0., 0.],
# [0., 1., 0., 0., 0.],
# [0., 0., 1., 0., 0.]])
1.3 按特定的数列创建
torch.arange()
创建等差一维张量
tensor = torch.arange(
start=0, # 起始值
end=5,