PyTorch采用Python语言接口来实现编程,它就像带GPU的Numpy,与Python一样都属于动态框架。PyTorch继承了Torch灵活、动态的编程环境和用户友好的界面,支持以快速和灵活的方式构建动态神经网络,还允许在训练过程中快速更改代码而不妨碍其性能,支持动态图形等尖端AI模型的能力,是快速实验的理想选择。
PyTorch由4个主要的包组成:
- torch:类似于Numpy的通用数组库,可将张量类型转换为torch.cuda.TensorFloat,并在GPU上进行计算。
- torch.autograd:用于构建计算图形并自动获取梯度的包。
- torch.nn:具有共享层和损失函数的神经网络库。
- torch.optim:具有通用优化算法(如SGD、Adam等)的优化包。
Numpy与Tensor
PyTorch的Tensor,它可以是零维(又称为标量或一个数)、一维、二维及多维的数组。
Tensor自称为神经网络界的Numpy,它与Numpy相似,二者可以共享内存,且之间的转换非常方便和高效。它们最大的区别就是Numpy会把ndarray放在CPU中进行加速运算,而由Torch产生的Tensor会放在GPU中进行加速运算(假设当前环境有GPU)。
Tensor概述
从接口的角度可以分为两类:
- torch.function,如 torch.sum、torch.add 等;
- tensor.function,如 tensor.view、tensor.add 等。
这些操作对大部分Tensor都是等价的,比如 torch.add(x, y) 和 x.add(y) 等价。
从修改方式的角度可以分为两类:
- 不修改自身数据,如 x.add(y),x的数据不变,返回一个新的tensor。
- 修改自身数据, 如x.add_(y) (运行符下划线后缀),运算结果存在x中,x被修改。
import torch
x = torch.tensor([1, 2])
y = torch.tensor([3, 4])
z = x.add(y)
print(z)
print(x)
x.add_(y)
print(x)
#结果:
# tensor([4, 6])
# tensor([1, 2])
# tensor([4, 6])
创建Tensor
创建Tensor的方法有很多,可以从列表或ndarray等类型进行构建,也可根据指定的形状构建。
常见的创建Tensor的方法:
函数 | 功能 |
---|---|
Tensor(*size) | 直接从参数构造一个张量,支持list,numpy数组 |
eye(row, column) | 创建指定行数和列数的二维单位Tensor |
linspace(start, end, steps) | 从start到end,均匀切分成steps份 |
logspace(start, end, steps) | 从10 ^ start到10 ^ end,均匀切分成steps份 |
rand/randn(*size) | 生成[0,1)均匀分布标准正态分布数据 |
ones(*size) | 返回指定shape的张量,元素初始为1 |
zeros(*size) | 返回指定shape的张量,元素初始为0 |
ones_like(t) | 返回与t的shape相同的张量,元素初始为1 |
zeros_like(t) | 返回与t的shape相同的张量,元素初始为0 |
arange(start, end, steps) | 在区间上生成等间距序列张量 |
from_Numpy(ndarray) | 从ndarray创建一个张量 |
注意torch.Tensor与torch.tensor的几点区别:
- torch.Tensor是torch.empty和torch.tensor之间的一种混合,但是,当传入数据时,torch.Tensor使用全局默认dtype(FloatTensor),而torch.tensor是从数据中推断数据类型。
- torch.tensor(1)返回一个固定值1,而torch.Tensor(1)返回一个大小为1的张量,它是随机初始化的值。
修改Tensor形状
在处理数据、构建网络层等过程中,经常需要了解Tensor的形状、修改Tensor的形状。
tensor常用修改形状的函数:
函数 | 说明 |
---|---|
size() | 返回张量的shape属性值 |
numel(input) | 计算元素个数 |
view(*shape) | 修改张量的shape,与reshape类似,但view返回的对象与源张量共享内存。reshape生成新的张量,而且不要求源张量是连续的。view(-1)展平数组 |
resize | 和view类似,但在size超出时重新分配内存空间 |
item | 若Tensor为单元素,则返回Python的标量 |
unsqueeze | 在指定维度增加一个1 |
squeeze | 在指定维度压缩一个1 |
torch.view与torch.reshape的异同:
- reshape()可以由torch.reshape(),也可由torch.Tensor.reshape()调用。
但view()只可由torch.Tensor.view()来调用。 - 对于一个将要被view的Tensor,新的size必须与原来的size与stride兼容。否则,在view之前必须调用contiguous()方法。
- 同样也是返回与input数据量相同,但形状不同的Tensor。若满足view的条件,则不会copy,若不满足,则会copy。
- 如果只想重塑张量,请使用torch.reshape。
如果还关注内存使用情况并希望确保两个张量共享相同的数据,请使用torch.view。
(未完待续……)
更多pytorch用法可参考pytorch中文文档
本文内容根据《Python深度学习:基于PyTorch》书中第2章内容总结
一起加油吧ヾ(◍°∇°◍)ノ゙