[Python/PyTorch基础] PyTorch学习笔记

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概述

接口的角度可以分为两类:

  1. torch.function,如 torch.sum、torch.add 等;
  2. tensor.function,如 tensor.view、tensor.add 等。
    这些操作对大部分Tensor都是等价的,比如 torch.add(x, y) 和 x.add(y) 等价。

修改方式的角度可以分为两类:

  1. 不修改自身数据,如 x.add(y),x的数据不变,返回一个新的tensor。
  2. 修改自身数据, 如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的几点区别:

  1. torch.Tensor是torch.empty和torch.tensor之间的一种混合,但是,当传入数据时,torch.Tensor使用全局默认dtype(FloatTensor),而torch.tensor是从数据中推断数据类型。
  2. 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的异同:

  1. reshape()可以由torch.reshape(),也可由torch.Tensor.reshape()调用。
    但view()只可由torch.Tensor.view()来调用。
  2. 对于一个将要被view的Tensor,新的size必须与原来的size与stride兼容。否则,在view之前必须调用contiguous()方法。
  3. 同样也是返回与input数据量相同,但形状不同的Tensor。若满足view的条件,则不会copy,若不满足,则会copy。
  4. 如果只想重塑张量,请使用torch.reshape。
    如果还关注内存使用情况并希望确保两个张量共享相同的数据,请使用torch.view。

(未完待续……)

更多pytorch用法可参考pytorch中文文档
本文内容根据《Python深度学习:基于PyTorch》书中第2章内容总结
一起加油吧ヾ(◍°∇°◍)ノ゙

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章