PyTorch 使用简介

2022-12-13 language python

Tensor

这是最基础的数据类型,提供了多种初始化方式和计算函数。

很多函数以 _ 结尾表示原地计算,可以通过 t.storage().data_ptr() 获取底层的指针,如果是原地计算,那么指针相同。

神经网络

对应了 torch.nn 模块,其本质是训练一个函数,例如,输入可以是图片,输出是这个图片所属类型,当给定了网络结构后 (如卷积、全链接等),能学习的就是这个函数的参数了,最后再通过损失函数、梯度下降就可以获取到对应函数 (神经网络)。

中间层包含了线性和激活函数,

Module

在 torch 中,就可以通过 Module 定义模型,这应该是最核心的类,

而 Parameter 设置额外参数。

当前很多模型以 Embedding 作为神经网络的第一层,而很早之前是将 Linear 作为第一层。

Embedding

其作用是将集合中的有限元素转换为指定大小的向量,这个有限集合可以是 NLP 中的词汇表、分类任务中的 Label 等。

import torch
import torch.nn as nn

torch.manual_seed(1)
# embed = nn.Embedding(3, 5)
embed = nn.Embedding(num_embeddings=3, embedding_dim=5)

print(embed.weight)
print(embed(torch.tensor([0], dtype=torch.int64)))

#Parameter containing:
#tensor([[ 0.6614,  0.2669,  0.0617,  0.6213, -0.4519],
#        [-0.1661, -1.5228,  0.3817, -1.0276, -0.5631],
#        [-0.8923, -0.0583, -0.1955, -0.9656,  0.4224]], requires_grad=True)
#tensor([[ 0.6614,  0.2669,  0.0617,  0.6213, -0.4519]],
#       grad_fn=<EmbeddingBackward0>)

其中两个核心的如参 num_embedding 和 embedding_dim 分别表示有限集合大小,也就是总共有多少元素需要转换;以及转换后向量的大小。会初始化一个 num_embedding * embedding_dim 大小的正态分布权重,可以通过 weight 查看。

除了随机初始化,还可以通过 Embedding.from_pretrained() 通过预定义矩阵初始化。

Linear

对输入向量进行线性变换,也就是 $Y=XW^T+B$ 计算,如下是将输入为 3 的向量转换为输出为 5 的向量。

import torch
import torch.nn as nn

torch.manual_seed(1)
linear = nn.Linear(in_features=3, out_features=5)

print(linear.bias)
print(linear.weight)
print(linear(torch.tensor([.0, 1., 2.])))

#Parameter containing:
#tensor([-0.0520,  0.0837, -0.0023,  0.5047,  0.1797], requires_grad=True)
#Parameter containing:
#tensor([[ 0.2975, -0.2548, -0.1119],
#        [ 0.2710, -0.5435,  0.3462],
#        [-0.1188,  0.2937,  0.0803],
#        [-0.0707,  0.1601,  0.0285],
#        [ 0.2109, -0.2250, -0.0421]], requires_grad=True)
#tensor([-0.5307,  0.2326,  0.4519,  0.7218, -0.1295], grad_fn=<ViewBackward0>)

其它

register_buffer() 用于注册参数,会随着模型移动,但是不会随梯度更新。

其它

DataLoader

通过 Dataset 封装数据集,然后使用 DataLoader 遍历数据,可以非常方便的进行批处理,大部分场景只需要实现 Dataset 中的 __len__ 和 __getitem__ 方法即可。