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