PyTorch-1.10(九)--torch.nn的Transformer层、线性层和Dropout

本文深入探讨了Transformer模型及其Encoder和Decoder组件,包括TransformerEncoderLayer和TransformerDecoderLayer的内部构造。同时,我们还剖析了线性变换层如nn.Linear、Bilinear和LazyLinear在模型中的作用。从nn.Dropout到nn.FeatureAlphaDropout,讨论了不同类型的Dropout层。最后,介绍了nn.Embedding和nn.EmbeddingBag在表示学习中的关键地位。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Transformer Layers

nn.Transformer

Transformer模型

nn.TransformerEncoder

Transformer模型Encoder模块

nn.TransformerDecoder

Transformer模型Decoder模块

nn.TransformerEncoderLayer

由自注意力和前馈网络组成的TransformerEncoderLayer

nn.TransformerDecoderLayer

由自注意力、多头注意力和前馈网络组成的TransformerDecoderLayer

Linear Layers

nn.Identity

参数不敏感的标识运算占位符

nn.Linear

对输入数据进行线性变换: y = x*A^T + b

nn.Bilinear

对输入数据进行双线性变换: y = x1^T *A* x2 + b

nn.LazyLinear

​ torch.nn.Linear线性模块,可推断in_features。

Dropout Layers

nn.Dropout

在训练过程中,使用来自伯努利分布的样本,以概率p随机地将输入张量的一些元素归零。

nn.Dropout2d

随机将整个通道归零(通道是2D特征图,例如,批量输入中第i个样本的第j个通道是2D张量输入[i,j])。

nn.Dropout3d

随机调零整个通道(通道是3D特征图,例如,批量输入中第i个样本的第j个通道是3D张量输入[i,j])。

nn.AlphaDropout

在输入上应用AlphaDropout。

nn.FeatureAlphaDropout

随机屏蔽整个通道 (通道是一个特征图)

Sparse Layers

nn.Embedding

一个简单的查找表,用于存储固定字典和大小的嵌入项。

nn.EmbeddingBag

计算嵌入的“包”的总和或平均,而不实例化中间嵌入。

Distance Functions

nn.CosineSimilarity

返回x1和x2之间的余弦相似性​和x2​, 沿着轴计算。

nn.PairwiseDistance

使用p-范数计算向量v1和v2之间的距离​。

Shuffle Layers

nn.ChannelShuffle

将形状为(∗,C、 H,W)的张量按照通道分成g组,并将其重新排列为(*,Cg,g,H,W),同时保持原始张量形状。

DataParallel Layers (multi-GPU, distributed)

nn.DataParallel

在模块级实现数据并行。

nn.parallel.DistributedDataParallel

在模块实现基于torch.distributed包的分布式数据并行。
可以使用torch.nn.transformer来进行文本分类,具体流程如下: 1. 准备数据集,将训练数据测试数据转化为tensor格式。 2. 构建Transformer模型,可以使用PyTorch提供的预训练模型,也可以自行构建模型。 3. 定义损失函数,常用的有交叉熵损失函数。 4. 定义优化器,常用的有Adam优化器。 5. 进行模型训练,使用训练数据对模型进行训练,并在测试数据上进行测试。 6. 对模型进行评估,可以使用准确率、F1分数等指标进行评估。 下面是一个简单的代码示例,用于实现基于Transformer的文本分类: ``` import torch import torch.nn as nn import torch.optim as optim from torchtext.datasets import IMDB from torchtext.data import Field, LabelField, BucketIterator # 将数据集转换为tensor格式 TEXT = Field(tokenize='spacy') LABEL = LabelField(dtype=torch.float) train_data, test_data = IMDB.splits(TEXT, LABEL) TEXT.build_vocab(train_data, max_size=25000) LABEL.build_vocab(train_data) train_iterator, test_iterator = BucketIterator.splits( (train_data, test_data), batch_size=64, device=torch.device('cuda')) # 定义Transformer模型 class TransformerModel(nn.Module): def __init__(self, ntoken, ninp, nhead, nhid, nlayers, dropout=0.5): super(TransformerModel, self).__init__() from torch.nn import TransformerEncoder, TransformerEncoderLayer self.model_type = 'Transformer' self.pos_encoder = PositionalEncoding(ninp, dropout) encoder_layers = TransformerEncoderLayer(ninp, nhead, nhid, dropout) self.transformer_encoder = TransformerEncoder(encoder_layers, nlayers) self.encoder = nn.Embedding(ntoken, ninp) self.ninp = ninp self.decoder = nn.Linear(ninp, 1) self.init_weights() def generate_square_subsequent_mask(self, sz): mask = (torch.triu(torch.ones(sz, sz)) == 1).transpose(0, 1) mask = mask.float().masked_fill(mask == 0, float('-inf')).masked_fill(mask == 1, float(0.0)) return mask def init_weights(self): initrange = 0.1 self.encoder.weight.data.uniform_(-initrange, initrange) self.decoder.bias.data.zero_() self.decoder.weight.data.uniform_(-initrange, initrange) def forward(self, src, src_mask): src = self.encoder(src) * math.sqrt(self.ninp) src = self.pos_encoder(src) output = self.transformer_encoder(src, src_mask) output = output.mean(dim=0) output = self.decoder(output) return output.squeeze() # 定义损失函数优化器 criterion = nn.BCEWithLogitsLoss() model = TransformerModel(len(TEXT.vocab), 512, 8, 2048, 6, dropout=0.5).to(device) optimizer = optim.Adam(model.parameters(), lr=0.0005) # 进行模型训练 def train(model, iterator, optimizer, criterion): model.train() epoch_loss = 0 for batch in iterator: optimizer.zero_grad() src = batch.text trg = batch.label src_mask = model.generate_square_subsequent_mask(src.shape[0]).to(device) output = model(src, src_mask) loss = criterion(output, trg) loss.backward() optimizer.step() epoch_loss += loss.item() return epoch_loss / len(iterator) # 在测试数据上进行测试 def evaluate(model, iterator, criterion): model.eval() epoch_loss = 0 with torch.no_grad(): for batch in iterator: src = batch.text trg = batch.label src_mask = model.generate_square_subsequent_mask(src.shape[0]).to(device) output = model(src, src_mask) loss = criterion(output, trg) epoch_loss += loss.item() return epoch_loss / len(iterator) N_EPOCHS = 10 best_valid_loss = float('inf') for epoch in range(N_EPOCHS): train_loss = train(model, train_iterator, optimizer, criterion) valid_loss = evaluate(model, test_iterator, criterion) if valid_loss < best_valid_loss: best_valid_loss = valid_loss torch.save(model.state_dict(), 'tut6-model.pt') print(f'Epoch: {epoch+1:02} | Train Loss: {train_loss:.3f} | Val. Loss: {valid_loss:.3f}') ``` 该示例中使用了IMDB数据集来进行文本分类,使用了PyTorch提供的Transformer模型,并使用Adam优化器进行模型训练。在进行模型训练时,使用了交叉熵损失函数来计算损失。最后,通过在测试数据上进行测试,评估了模型的性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值