15import torch
16from torch import nn
17
18from labml import experiment
19from labml.configs import option
20from labml_helpers.module import Module
21from labml_nn.experiments.nlp_classification import NLPClassificationConfigs
22from labml_nn.transformers import Encoder
23from labml_nn.transformers import TransformerConfigs
26class TransformerClassifier(nn.Module):
encoder
是变压器编码器src_embed
是令牌嵌入模块(带有位置编码)generator
是给出 logit 的最后一个完全连接的层。30 def __init__(self, encoder: Encoder, src_embed: Module, generator: nn.Linear):
37 super().__init__()
38 self.src_embed = src_embed
39 self.encoder = encoder
40 self.generator = generator
42 def forward(self, x: torch.Tensor):
使用位置编码获取令牌嵌入
44 x = self.src_embed(x)
变压器编码
46 x = self.encoder(x, None)
52 x = self.generator(x[-1])
返回结果(第二个值用于状态,因为我们的训练器也与 RNN 一起使用)
56 return x, None
59class Configs(NLPClassificationConfigs):
分类模型
68 model: TransformerClassifier
变压器
70 transformer: TransformerConfigs
73@option(Configs.transformer)
74def _transformer_configs(c: Configs):
设置嵌入和生成 logit 的词汇量大小
83 conf.n_src_vocab = c.n_tokens
84 conf.n_tgt_vocab = c.n_tokens
87 return conf
97 from labml_nn.transformers.fnet import FNetMix
98 return FNetMix()
创建分类模型
101@option(Configs.model)
102def _model(c: Configs):
106 m = TransformerClassifier(c.transformer.encoder,
107 c.transformer.src_embed,
108 nn.Linear(c.d_model, c.n_classes)).to(c.device)
109
110 return m
113def main():
创建实验
115 experiment.create(name="fnet")
创建配置
117 conf = Configs()
覆盖配置
119 experiment.configs(conf, {
使用世界级分词器
121 'tokenizer': 'basic_english',
为时代而训练
124 'epochs': 32,
在训练和验证之间切换每个纪元的次数
127 'inner_iterations': 10,
变压器配置(与默认值相同)
130 'transformer.d_model': 512,
131 'transformer.ffn.d_ff': 2048,
132 'transformer.n_heads': 8,
133 'transformer.n_layers': 6,
设置用于保存和加载的模型
145 experiment.add_pytorch_models({'model': conf.model})
开始实验
148 with experiment.start():
跑步训练
150 conf.run()
154if __name__ == '__main__':
155 main()