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