一、跑通baseline
1.云服务器选择
图1-1:Tesla V100 32GB显卡
使用了AutoDL的云服务器,选型Tesla V100 32GB版本运行baseline,显卡性能强劲,可以很快完成任务。
2.运行过程的小bug
图1-2:出现bug的代码片段
改正方案是:先后顺序替换一下就可以了。
3.运行结果
- 训练时长:24.05min
- 分数:0.1368
二、部分代码分析
# 模型
'''
直接采用一个transformer encoder model就好了
'''
class TransformerEncoderModel(nn.Module):
def __init__(self, input_dim, d_model, num_heads, fnn_dim, num_layers, dropout):
super().__init__()
self.embedding = nn.Embedding(input_dim, d_model)
self.layerNorm = nn.LayerNorm(d_model)
self.encoder_layer = nn.TransformerEncoderLayer(d_model=d_model,
nhead=num_heads,
dim_feedforward=fnn_dim,
dropout=dropout,
batch_first=True,
norm_first=True # pre-layernorm
)
self.transformer_encoder = nn.TransformerEncoder(self.encoder_layer,
num_layers=num_layers,
norm=self.layerNorm)
self.dropout = nn.Dropout(dropout)
self.lc = nn.Sequential(nn.Linear(d_model, 256),
nn.Sigmoid(),
nn.Linear(256, 96),
nn.Sigmoid(),
nn.Linear(96, 1))
def forward(self, src):
# src shape: [batch_size, src_len]
embedded = self.dropout(self.embedding(src))
# embedded shape: [batch_size, src_len, d_model]
outputs = self.transformer_encoder(embedded)
# outputs shape: [batch_size, src_len, d_model]
# fisrt
z = outputs[:,0,:]
# z = torch.sum(outputs, dim=1)
# print(z)
# z shape: [bs, d_model]
outputs = self.lc(z)
# print(outputs)
# outputs shape: [bs, 1]
return outputs.squeeze(-1)
图2-1:transformer encoder model
这段代码定义了一个基于 Transformer 编码器的模型 TransformerEncoderModel。模型的目的是处理输入序列并生成一个输出。下面是对代码的详细解析:
### 类定义
class TransformerEncoderModel(nn.Module):
def __init__(self, input_dim, d_model, num_heads, fnn_dim, num_layers, dropout):
super().__init__()
TransformerEncoderModel 继承自 nn.Module,这是所有 PyTorch 神经网络模块的基类。构造函数接受多个参数来初始化模型。
初始化参数
- input_dim: 输入的词汇表大小。
- d_model: 嵌入维度(Transformer 模型的隐藏大小)。
- num_heads: 多头注意力机制的头数。
- fnn_dim: 前馈神经网络(Feedforward Neural Network, FNN)的隐藏层大小。
- num_layers: Transformer 编码器层的数量。
- dropout: dropout 率,用于防止过拟合。
综述
这个模型使用 Transformer 编码器对输入序列进行编码,并通过全连接层将编码结果映射到单个输出值。模型可以用于序列分类、回归或其他需要单值输出的任务。
最后,感谢Datawhale提供这个学习交流机会,以及启智社区的免费算力支持!!!😊😊😊