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_embeddingembedding_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__ 方法即可。