pytorch transformer 简单例子
PyTorch Transformer是一种机器翻译模型,它使用注意力机制来实现在输入和输出序列之间的对齐。
下面,我们将分步骤介绍在PyTorch中建立Transformer模型的简单例子。
1.导入必要的库和模块。
我们需要导入以下库和模块:
```
import torch
as nn
import torch.optim as optim
import numpy as np
```
2.定义超参数。
由于我们的模型已经使用了PyTorch的transformer库,因此可以使用现有参数的默认值。 我们只需要定义以下超参数:
```
SRC_VOCAB_SIZE = 100
TGT_VOCAB_SIZE = 100
EMB_SIZE = 256
HIDDEN_SIZE = 512
NUM_LAYERS = 6
NUM_HEADS = 8
BATCH_SIZE = 32
LR = 0.001
NUM_EPOCHS = 10
DEVICE = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
```
3.创建数据集。
我们将创建一个简单的序列生成器,该生成器将使用numpy随机生成一个小批次的序列。 我们首先定义一个函数,该函数将返回一个包含随机整数的列表,该列表的长度在1到20之间。
```
def get_random_sequence():
return np.random.randint(1, 100, np.random.randint(1, 20)).tolist()
```
接下来,我们使用PyTorch的数据集和数据加载器来批处理我们的序列:
```
class SequenceDataset(torch.utils.data.Dataset):
def __init__(self, size):
self.size = size
def __getitem__(self, idx):
src = get_random_sequence()
tgt = get_random_sequence()
return src, tgt
def __len__(self):
return self.size
train_data = SequenceDataset(1000)
train_loader = torch.utils.data.DataLoader(train_data, batch_size=BATCH_SIZE, shuffle=True, num_workers=4)
```
4.定义Transformer模型。
我们使用PyTorch的Transformer类来定义我们的模型,这个类已经实现了Transformer的基本架构。 我们可以在其基础上进行微调:
```
class TransformerModel(nn.Module):
def __init__(self, src_vocab_size, tgt_vocab_size, emb_size, hidden_size, num_layers, num_heads):
super(TransformerModel, self).__init__()
der = nn.Embedding(src_vocab_size, emb_size)
self.decoder = nn.Embedding(tgt_vocab_size, emb_size)
ansformer = nn.Transformer(
emb_size,
num_heads,
num_layers,
batch_first=True,
dropout=0.1
)
self.linear = nn.Linear(emb_size, tgt_vocab_size)
def forward(self, src, tgt):
src_emb = der(src)
tgt_emb = self.decoder(tgt)
memory_seq = der(src_emb)
tgt_seq = ansformer.decoder(tgt_emb, memory_seq)
output = self.linear(tgt_seq)
return output
```
这个模型将输入和输出序列作为参数,使用encoder和decoder层将它们映射为嵌入,然后将它们送入Transformer中。 我们使用一个线性层将Transformer的输出映射回目标序列。
5.训练模型。
我们使用Adam优化器和交叉熵损失函数来训练我们的模型。
```
model = TransformerModel(SRC_VOCAB_SIZE, TGT_VOCAB_SIZE, EMB_SIZE, HIDDEN_SIZE, NUM_LAYERS, NUM_HEADS).to(DEVICE)
optimizer = optim.Adam(model.parameters(), lr=LR)
criterion = nn.CrossEntropyLoss()
for epoch in range(NUM_EPOCHS):
for i, (src_batch, tgt_batch) in enumerate(train_loader):
src_batch = torch.LongTensor(src_batch).to(DEVICE)
tgt_batch = torch.LongTensor(tgt_batch).to(DEVICE)
tgt_input = tgt_batch[:, :-1]
tgt_output = tgt_batch[:, 1:]
_grad()
output = model(src_batch, tgt_input)
loss = shape(-1, TGT_VOCAB_SIZE), shape(-1))
loss.backward()
optimizer.step()
if i % 100 == 0:
print('epoch:', epoch, 'step:', i, 'loss:', loss.item())
```
我们使用交叉熵损失函数来计算每个Epoch的损失,并更新优化器中的梯度。 在每个Epoch的末尾,我们将损失打印出来。
6.测试模型。
我们创建一个函数,该函数将随机生成一个输入序列,并将其送入我们的模型来生成输出序列:
```
def generate_sequence(model):
_grad():
src_seq = torch.LongTensor(get_random_sequence()).unsqueeze(0).to(DEVICE)
tgt_seq = torch.LongTensor([1]).unsqueeze(0).to(DEVICE) # start decoding token
for i in range(20):
output_seq = model(src_seq, tgt_seq)
_, max_indices = torch.max(output_seq, dim=-1)
if max_indices[0][-1] == 2: # end decoding token
random翻译 break
tgt_seq = torch.cat((tgt_seq, max_indices[:, -1:]), dim=-1)
return tgt_seq[0].tolist()
```
我们将第一个开始解码的标记附加到我们的输出序列的开头,并使用一个循环来生成每个下一个标记。
7.完整代码。
```
import torch
as nn
import torch.optim as optim
import numpy as np
SRC_VOCAB_SIZE = 100
TGT_VOCAB_SIZE = 100
EMB_SIZE = 256
HIDDEN_SIZE = 512
NUM_LAYERS = 6
NUM_HEADS = 8
BATCH_SIZE = 32
LR = 0.001
NUM_EPOCHS = 10
DEVICE = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
def get_random_sequence():
return np.random.randint(1, 100, np.random.randint(1, 20)).tolist()
class SequenceDataset(torch.utils.data.Dataset):
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论