使用PyTorch来实现一个原版transformer代码模型,及样例数据,用代码了解transformer的原理与实现

Transformer代码(Pytorch实现和详解)!!! 这个是第一版,有些代码如果不对,欢迎在评论指正,后续会慢慢改,我也是刚接触transformer,若有些地方理解不对还请指正。 阅读详情

如何构建一个原版transformer代码模型,和他的样例数据,如何进行完整的训练和预测。
原版transformer代码模型,包括完整的模型代码和样例数据,可以进行完整的训练和预测。


声明:以下代码仅供参考:


构建一个基于原版Transformer模型的代码示例。使用PyTorch来实现这个模型,并提供一个简单的样例数据集来进行训练和预测。

步骤概述

  1. 安装依赖

    :确保你的环境中已经安装了必要的库。

  2. 准备数据集

    :创建一个简单的样例数据集。

  3. 定义Transformer模型

    :编写完整的Transformer模型代码。

  4. 训练模型

    :编写训练代码。

  5. 预测

    :编写预测代码。

1. 安装依赖

首先,确保你已经安装了PyTorch和其他必要的库。

pip install torch torchvision matplotlib numpy pandas  

2. 准备数据集

先创建一个简单的样例数据集,用于演示目的。这里我们使用一个非常简单的语言建模任务,即生成数字序列的下一个数字。

数据生成脚本 generate_data.py
import numpy as np  
  
def generate_sequence(length, vocab_size):  
    return np.random.randint(vocab_size, size=length)  
  
def generate_dataset(num_samples, seq_length, vocab_size):  
    X = []  
    y = []  
    for _ in range(num_samples):  
        sequence = generate_sequence(seq_length + 1, vocab_size)  
        X.append(sequence[:-1])  
        y.append(sequence[-1])  
    return np.array(X), np.array(y)  
  
# Parameters  
num_samples = 1000  
seq_length = 10  
vocab_size = 10  
  
# Generate dataset  
X_train, y_train = generate_dataset(num_samples, seq_length, vocab_size)  
X_test, y_test = generate_dataset(num_samples // 10, seq_length, vocab_size)  
  
# Save dataset  
np.save('X_train.npy', X_train)  
np.save('y_train.npy', y_train)  
np.save('X_test.npy', X_test)  
np.save('y_test.npy', y_test)  

运行上述脚本以生成数据集:

python generate_data.py  

3. 定义Transformer模型

我们将定义一个简单的Transformer模型来进行语言建模任务。

Transformer模型代码 transformer_model.py
import torch  
import torch.nn as nn  
import torch.optim as optim  
  
class PositionalEncoding(nn.Module):  
    def __init__(self, d_model, max_len=5000):  
        super(PositionalEncoding, self).__init__()  
        pe = torch.zeros(max_len, d_model)  
        position = torch.arange(0, max_len, dtype=torch.float).unsqueeze(1)  
        div_term = torch.exp(torch.arange(0, d_model, 2).float() * (-torch.log(torch.tensor(10000.0)) / d_model))  
        pe[:, 0::2] = torch.sin(position * div_term)  
        pe[:, 1::2] = torch.cos(position * div_term)  
        pe = pe.unsqueeze(0).transpose(0, 1)  
        self.register_buffer('pe', pe)  
  
    def forward(self, x):  
        x = x + self.pe[:x.size(0), :]  
        return x  
  
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, 5000)  
        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, ntoken)  
  
        self.init_weights()  
  
    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 = self.encoder(src) * math.sqrt(self.ninp)  
        src = self.pos_encoder(src)  
        output = self.transformer_encoder(src)  
        output = self.decoder(output)  
        return output  
  
# Model parameters  
ntokens = 10  # Size of vocabulary  
emsize = 200  # Embedding dimension  
nhid = 200  # The dimension of the feedforward network model in nn.TransformerEncoder  
nlayers = 2  # The number of nn.TransformerEncoderLayer in nn.TransformerEncoder  
nhead = 2  # The number of heads in the multiheadattention models  
dropout = 0.2  # The dropout value  
  
model = TransformerModel(ntokens, emsize, nhead, nhid, nlayers, dropout)  

4. 训练模型

我们将编写训练代码来训练Transformer模型。

训练代码 train_transformer.py
[<title="Training a Simple Transformer Model">]  
import torch  
import torch.nn as nn  
import torch.optim as optim  
from transformer_model import TransformerModel  
import numpy as np  
import math  
  
# Load data  
X_train = np.load('X_train.npy')  
y_train = np.load('y_train.npy')  
X_test = np.load('X_test.npy')  
y_test = np.load('y_test.npy')  
  
# Convert to PyTorch tensors  
X_train_tensor = torch.from_numpy(X_train).long()  
y_train_tensor = torch.from_numpy(y_train).long()  
X_test_tensor = torch.from_numpy(X_test).long()  
y_test_tensor = torch.from_numpy(y_test).long()  
  
# Hyperparameters  
ntokens = 10  # Size of vocabulary  
emsize = 200  # Embedding dimension  
nhid = 200  # The dimension of the feedforward network model in nn.TransformerEncoder  
nlayers = 2  # The number of nn.TransformerEncoderLayer in nn.TransformerEncoder  
nhead = 2  # The number of heads in the multiheadattention models  
dropout = 0.2  # The dropout value  
lr = 0.001  # Learning rate  
batch_size = 16  # Batch size  
epochs = 10  # Number of epochs  
  
# Define model, loss function, and optimizer  
model = TransformerModel(ntokens, emsize, nhead, nhid, nlayers, dropout)  
criterion = nn.CrossEntropyLoss()  
optimizer = optim.Adam(model.parameters(), lr=lr)  
  
# Training loop  
for epoch in range(epochs):  
    model.train()  
    total_loss = 0.  
    num_batches = len(X_train_tensor) // batch_size  
      
    for i in range(num_batches):  
        start_idx = i * batch_size  
        end_idx = (i + 1) * batch_size  
          
        data = X_train_tensor[start_idx:end_idx].permute(1, 0)  # Shape: (seq_length, batch_size)  
        target = y_train_tensor[start_idx:end_idx]  # Shape: (batch_size)  
          
        optimizer.zero_grad()  
        output = model(data)  
        loss = criterion(output.view(-1, ntokens), target)  
        loss.backward()  
        optimizer.step()  
          
        total_loss += loss.item()  
      
    avg_loss = total_loss / num_batches  
    print(f'Epoch {epoch+1}/{epochs}, Loss: {avg_loss:.4f}')  
  
# Evaluation loop  
model.eval()  
total_correct = 0  
num_batches = len(X_test_tensor) // batch_size  
  
with torch.no_grad():  
    for i in range(num_batches):  
        start_idx = i * batch_size  
        end_idx = (i + 1) * batch_size  
          
        data = X_test_tensor[start_idx:end_idx].permute(1, 0)  # Shape: (seq_length, batch_size)  
        target = y_test_tensor[start_idx:end_idx]  # Shape: (batch_size)  
          
        output = model(data)  
        _, predicted = torch.max(output, dim=-1)  
        correct = (predicted == target).sum().item()  
        total_correct += correct  
  
accuracy = total_correct / (len(X_test_tensor) * ntokens)  
print(f'Test Accuracy: {accuracy:.4f}')  

5. 预测

我们将编写预测代码来测试Transformer模型的性能。

预测代码 predict_transformer.py
[<title="Predicting with a Trained Transformer Model">]  
import torch  
from transformer_model import TransformerModel  
import numpy as np  
  
# Load trained model  
ntokens = 10  # Size of vocabulary  
emsize = 200  # Embedding dimension  
nhid = 200  # The dimension of the feedforward network model in nn.TransformerEncoder  
nlayers = 2  # The number of nn.TransformerEncoderLayer in nn.TransformerEncoder  
nhead = 2  # The number of heads in the multiheadattention models  
dropout = 0.2  # The dropout value  
  
model = TransformerModel(ntokens, emsize, nhead, nhid, nlayers, dropout)  
model.load_state_dict(torch.load('model.pth'))  
model.eval()  
  
# Sample input  
sample_input = np.array([3, 7, 2, 5, 8, 9, 1, 4, 6]).reshape((9, 1))  # Shape: (seq_length, batch_size)  
sample_input_tensor = torch.from_numpy(sample_input).long()  
  
# Predict next token  
with torch.no_grad():  
    output = model(sample_input_tensor)  
    _, predicted = torch.max(output, dim=-1)  
  
next_token = predicted[-1].item()  
print(f'Next token prediction: {next_token}')  

总结

通过以上步骤,构建一个基于原版Transformer模型的代码示例,并使用简单的数字序列数据集进行训练和预测。以下是所有相关的代码文件:

  1. 数据生成脚本

    (generate_data.py)

  2. Transformer模型代码

    (transformer_model.py)

  3. 训练代码

    (train_transformer.py)

  4. 预测代码

    (predict_transformer.py)

希望这些信息对你有所帮助!如果有任何问题或需要进一步的帮助,请告诉我。

对自己的/ 每个模块都有详细的注释


用代码教你更深度地了解transformer的原理和实现


当然可以!为了更深入地理解Transformer模型的原理和实现,我们将从头开始构建一个简单的Transformer模型,并逐步解释每个部分的作用。我们将使用PyTorch来实现这个过程。

步骤概述

  1. 安装依赖

    :确保你的环境中已经安装了必要的库。

  2. 准备数据集

    :创建一个简单的样例数据集。

  3. 定义基本组件

    :实现Positional Encoding、Multi-Head Attention、Feed-Forward Network等基本组件。

  4. 定义Encoder和Decoder层

    :基于基本组件构建Encoder和Decoder层。

  5. 定义完整的Transformer模型

    :将Encoder和Decoder层组合成完整的Transformer模型。

  6. 训练模型

    :编写训练代码。

  7. 预测

    :编写预测代码。

1. 安装依赖

首先,确保你已经安装了PyTorch和其他必要的库。

pip install torch torchvision matplotlib numpy pandas  

2. 准备数据集

我们将创建一个简单的样例数据集,用于演示目的。这里我们使用一个非常简单的语言建模任务,即生成数字序列的下一个数字。

数据生成脚本 generate_data.py
import numpy as np  
  
def generate_sequence(length, vocab_size):  
    return np.random.randint(vocab_size, size=length)  
  
def generate_dataset(num_samples, seq_length, vocab_size):  
    X = []  
    y = []  
    for _ in range(num_samples):  
        sequence = generate_sequence(seq_length + 1, vocab_size)  
        X.append(sequence[:-1])  
        y.append(sequence[-1])  
    return np.array(X), np.array(y)  
  
# Parameters  
num_samples = 1000  
seq_length = 10  
vocab_size = 10  
  
# Generate dataset  
X_train, y_train = generate_dataset(num_samples, seq_length, vocab_size)  
X_test, y_test = generate_dataset(num_samples // 10, seq_length, vocab_size)  
  
# Save dataset  
np.save('X_train.npy', X_train)  
np.save('y_train.npy', y_train)  
np.save('X_test.npy', X_test)  
np.save('y_test.npy', y_test)  

运行上述脚本以生成数据集:

python generate_data.py  

3. 定义基本组件

我们将从头开始实现Positional Encoding、Multi-Head Attention、Feed-Forward Network等基本组件。

基本组件代码 components.py
import torch  
import torch.nn as nn  
import math  
  
class PositionalEncoding(nn.Module):  
    def __init__(self, d_model, max_len=5000):  
        super(PositionalEncoding, self).__init__()  
        pe = torch.zeros(max_len, d_model)  
        position = torch.arange(0, max_len, dtype=torch.float).unsqueeze(1)  
        div_term = torch.exp(torch.arange(0, d_model, 2).float() * (-math.log(10000.0) / d_model))  
        pe[:, 0::2] = torch.sin(position * div_term)  
        pe[:, 1::2] = torch.cos(position * div_term)  
        pe = pe.unsqueeze(0).transpose(0, 1)  
        self.register_buffer('pe', pe)  
  
    def forward(self, x):  
        x = x + self.pe[:x.size(0), :]  
        return x  
  
class MultiHeadAttention(nn.Module):  
    def __init__(self, embed_size, heads):  
        super(MultiHeadAttention, self).__init__()  
        self.embed_size = embed_size  
        self.heads = heads  
        self.head_dim = embed_size // heads  
  
        assert (self.head_dim * heads == embed_size), "Embedding size needs to be divisible by heads"  
  
        self.values = nn.Linear(self.head_dim, self.head_dim, bias=False)  
        self.keys = nn.Linear(self.head_dim, self.head_dim, bias=False)  
        self.queries = nn.Linear(self.head_dim, self.head_dim, bias=False)  
        self.fc_out = nn.Linear(heads * self.head_dim, embed_size)  
  
    def forward(self, values, keys, query, mask):  
        N = query.shape[0]  
        value_len, key_len, query_len = values.shape[1], keys.shape[1], query.shape[1]  
  
        # Split the embedding into self.heads different pieces  
        values = values.reshape(N, value_len, self.heads, self.head_dim)  
        keys = keys.reshape(N, key_len, self.heads, self.head_dim)  
        queries = query.reshape(N, query_len, self.heads, self.head_dim)  
  
        values = self.values(values)  
        keys = self.keys(keys)  
        queries = self.queries(queries)  
  
        energy = torch.einsum("nqhd,nkhd->nhqk", [queries, keys])  
  
        if mask is not None:  
            energy = energy.masked_fill(mask == 0, float("-1e20"))  
  
        attention = torch.softmax(energy / (self.embed_size ** (1/2)), dim=3)  
  
        out = torch.einsum("nhql,nlhd->nqhd", [attention, values]).reshape(  
            N, query_len, self.heads*self.head_dim  
        )  
  
        out = self.fc_out(out)  
        return out  
  
class FeedForward(nn.Module):  
    def __init__(self, embed_size, expansion_factor=4):  
        super(FeedForward, self).__init__()  
        self.model = nn.Sequential(  
            nn.Linear(embed_size, embed_size*expansion_factor),  
            nn.ReLU(),  
            nn.Linear(embed_size*expansion_factor, embed_size),  
        )  
  
    def forward(self, x):  
        return self.model(x)  

4. 定义Encoder和Decoder层

我们将基于基本组件构建Encoder和Decoder层。

Encoder和Decoder层代码 encoder_decoder.py
import torch  
import torch.nn as nn  
from components import PositionalEncoding, MultiHeadAttention, FeedForward  
  
class TransformerBlock(nn.Module):  
    def __init__(self, embed_size, heads, dropout, forward_expansion):  
        super(TransformerBlock, self).__init__()  
        self.attention = MultiHeadAttention(embed_size, heads)  
        self.norm1 = nn.LayerNorm(embed_size)  
        self.norm2 = nn.LayerNorm(embed_size)  
  
        self.feed_forward = FeedForward(embed_size, forward_expansion)  
        self.dropout = nn.Dropout(dropout)  
  
    def forward(self, value, key, query, mask):  
        attention = self.attention(value, key, query, mask)  
  
        # Add skip connection, run through normalization and finally dropout  
        x = self.dropout(self.norm1(attention + query))  
        forward = self.feed_forward(x)  
        out = self.dropout(self.norm2(forward + x))  
        return out  
  
class Encoder(nn.Module):  
    def __init__(  
        self,  
        src_vocab_size,  
        embed_size,  
        num_layers,  
        heads,  
        device,  
        forward_expansion,  
        dropout,  
        max_length,  
    ):  
        super(Encoder, self).__init__()  
        self.embed_size = embed_size  
        self.device = device  
        self.word_embedding = nn.Embedding(src_vocab_size, embed_size)  
        self.position_embedding = PositionalEncoding(embed_size, max_length)  
  
        self.layers = nn.ModuleList(  
            [  
                TransformerBlock(  
                    embed_size,  
                    heads,  
                    dropout=dropout,  
                    forward_expansion=forward_expansion,  
                )  
                for _ in range(num_layers)  
            ]  
        )  
  
        self.dropout = nn.Dropout(dropout)  
  
    def forward(self, x, mask):  
        N, seq_length = x.shape  
        positions = torch.arange(0, seq_length).expand(N, seq_length).to(self.device)  
        out = self.dropout((self.word_embedding(x) + self.position_embedding(positions)))  
  
        for layer in self.layers:  
            out = layer(out, out, out, mask)  
  
        return out  
  
class DecoderBlock(nn.Module):  
    def __init__(self, embed_size, heads, forward_expansion, dropout, device):  
        super(DecoderBlock, self).__init__()  
        self.attention = MultiHeadAttention(embed_size, heads)  
        self.norm = nn.LayerNorm(embed_size)  
        self.transformer_block = TransformerBlock(  
            embed_size, heads, dropout, forward_expansion  
        )  
        self.dropout = nn.Dropout(dropout)  
  
    def forward(self, x, value, key, src_mask, trg_mask):  
        attention = self.attention(x, x, x, trg_mask)  
        query = self.dropout(self.norm(attention + x))  
        out = self.transformer_block(value, key, query, src_mask)  
        return out  
  
class Decoder(nn.Module):  
    def __init__(  
        self,  
        trg_vocab_size,  
        embed_size,  
        num_layers,  
        heads,  
        forward_expansion,  
        dropout,  
        device,  
        max_length,  
    ):  
        super(Decoder, self).__init__()  
        self.device = device  
        self.word_embedding = nn.Embedding(trg_vocab_size, embed_size)  
        self.position_embedding = PositionalEncoding(embed_size, max_length)  
  
        self.layers = nn.ModuleList(  
            [  
                DecoderBlock(embed_size, heads, forward_expansion, dropout, device)  
                for _ in range(num_layers)  
            ]  
        )  
  
        self.fc_out = nn.Linear(embed_size, trg_vocab_size)  
        self.dropout = nn.Dropout(dropout)  
  
    def forward(self, x, enc_out, src_mask, trg_mask):  
        N, seq_length = x.shape  
        positions = torch.arange(0, seq_length).expand(N, seq_length).to(self.device)  
        x = self.dropout((self.word_embedding(x) + self.position_embedding(positions)))  
  
        for layer in self.layers:  
            x = layer(x, enc_out, enc_out, src_mask, trg_mask)  
  
        out = self.fc_out(x)  
        return out  

5. 定义完整的Transformer模型

我们将基于Encoder和Decoder层组合成完整的Transformer模型。

完整的Transformer模型代码 transformer_model.py
import torch  
import torch.nn as nn  
from encoder_decoder import Encoder, Decoder  
  
class Transformer(nn.Module):  
    def __init__(  
        self,  
        src_vocab_size,  
        trg_vocab_size,  
        src_pad_idx,  
        trg_pad_idx,  
        embed_size=256,  
        num_layers=6,  
        forward_expansion=4,  
        heads=8,  
        dropout=0,  
        device="cpu",  
        max_length=100,  
    ):  
        super(Transformer, self).__init__()  
        self.encoder = Encoder(  
            src_vocab_size,  
            embed_size,  
            num_layers,  
            heads,  
            device,  
            forward_expansion,  
            dropout,  
            max_length,  
        )  
        self.decoder = Decoder(  
            trg_vocab_size,  
            embed_size,  
            num_layers,  
            heads,  
            forward_expansion,  
            dropout,  
            device,  
            max_length,  
        )  
        self.src_pad_idx = src_pad_idx  
        self.trg_pad_idx = trg_pad_idx  
        self.device = device  
  
    def make_src_mask(self, src):  
        src_mask = (src != self.src_pad_idx).unsqueeze(1).unsqueeze(2)  
        # (N, 1, 1, src_len)  
        return src_mask.to(self.device)  
  
    def make_trg_mask(self, trg):  
        N, trg_len = trg.shape  
        trg_mask = torch.tril(torch.ones((trg_len, trg_len))).expand(  
            N, 1, trg_len, trg_len  
        )  
        return trg_mask.to(self.device)  
  
    def forward(self, src, trg):  
        src_mask = self.make_src_mask(src)  
        trg_mask = self.make_trg_mask(trg)  
        enc_src = self.encoder(src, src_mask)  
        out = self.decoder(trg, enc_src, src_mask, trg_mask)  
        return out  

6. 训练模型

我们将编写训练代码来训练Transformer模型。

训练代码 train_transformer.py
[<title="Training a Simple Transformer Model">]  
import torch  
import torch.nn as nn  
import torch.optim as optim  
from transformer_model import Transformer  
from components import PositionalEncoding, MultiHeadAttention, FeedForward  
from encoder_decoder import TransformerBlock, Encoder, Decoder  
import numpy as np  
import math  
  
# Load data  
X_train = np.load('X_train.npy')  
y_train = np.load('y_train.npy')  
X_test = np.load('X_test.npy')  
y_test = np.load('y_test.npy')  
  
# Convert to PyTorch tensors  
X_train_tensor = torch.from_numpy(X_train).long()  
y_train_tensor = torch.from_numpy(y_train).long()  
X_test_tensor = torch.from_numpy(X_test).long()  
y_test_tensor = torch.from_numpy(y_test).long()  
  
# Hyperparameters  
src_vocab_size = 10  # Size of vocabulary  
trg_vocab_size = 10  # Size of vocabulary  
embed_size = 256     # Embedding dimension  
num_layers = 2       # Number of layers in the Transformer  
heads = 8            # Number of heads in the multiheadattention models  
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")  
forward_expansion = 4  
dropout = 0.1        # Dropout rate  
max_length = 100     # Maximum length of sequences  
lr = 0.0001          # Learning rate  
batch_size = 16      # Batch size  
epochs = 10          # Number of epochs  
  
# Define model, loss function, and optimizer  
model = Transformer(  
    src_vocab_size,  
    trg_vocab_size,  
    src_pad_idx=0,  
    trg_pad_idx=0,  
    embed_size=embed_size,  
    num_layers=num_layers,  
    forward_expansion=forward_expansion,  
    heads=heads,  
    dropout=dropout,  
    device=device,  
    max_length=max_length,  
).to(device)  
  
criterion = nn.CrossEntropyLoss(ignore_index=0)  
optimizer = optim.Adam(model.parameters(), lr=lr)  
  
# Training loop  
for epoch in range(epochs):  
    model.train()  
    total_loss = 0.  
    num_batches = len(X_train_tensor) // batch_size  
      
    for i in range(num_batches):  
        start_idx = i * batch_size  
        end_idx = (i + 1) * batch_size  
          
        src = X_train_tensor[start_idx:end_idx].permute(1, 0).to(device)  # Shape: (seq_length, batch_size)  
        trg = y_train_tensor[start_idx:end_idx].unsqueeze(0).to(device)   # Shape: (1, batch_size)  
          
        optimizer.zero_grad()  
        output = model(src, trg)  
        output = output.squeeze(0)  # Remove the sequence length dimension  
        loss = criterion(output, trg.squeeze(0))  
        loss.backward()  
        optimizer.step()  
          
        total_loss += loss.item()  
      
    avg_loss = total_loss / num_batches  
    print(f'Epoch {epoch+1}/{epochs}, Loss: {avg_loss:.4f}')  
  
# Save the trained model  
torch.save(model.state_dict(), 'model.pth')  

7. 预测

我们将编写预测代码来测试Transformer模型的性能。

预测代码 predict_transformer.py
[<title="Predicting with a Trained Transformer Model">]  
import torch  
from transformer_model import Transformer  
import numpy as np  
  
# Load trained model  
src_vocab_size = 10  # Size of vocabulary  
trg_vocab_size = 10  # Size of vocabulary  
embed_size = 256     # Embedding dimension  
num_layers = 2       # Number of layers in the Transformer  
heads = 8            # Number of heads in the multiheadattention models  
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")  
forward_expansion = 4  
dropout = 0.1        # Dropout rate  
max_length = 100     # Maximum length of sequences  
  
model = Transformer(  
    src_vocab_size,  
    trg_vocab_size,  
    src_pad_idx=0,  
    trg_pad_idx=0,  
    embed_size=embed_size,  
    num_layers=num_layers,  
    forward_expansion=forward_expansion,  
    heads=heads,  
    dropout=dropout,  
    device=device,  
    max_length=max_length,  
).to(device)  
  
model.load_state_dict(torch.load('model.pth'))  
model.eval()  
  
# Sample input  
sample_input = np.array([3, 7, 2, 5, 8, 9, 1, 4, 6]).reshape((9, 1))  # Shape: (seq_length, batch_size)  
sample_input_tensor = torch.from_numpy(sample_input).long().to(device)  
  
# Predict next token  
with torch.no_grad():  
    src_mask = model.make_src_mask(sample_input_tensor)  
    trg_mask = model.make_trg_mask(sample_input_tensor)  
    output = model(sample_input_tensor, sample_input_tensor)  
    _, predicted = torch.max(output, dim=-1)  
  
next_token = predicted[-1].item()  
print(f'Next token prediction: {next_token}')  

总结

从头开始构建一个简单的Transformer模型,并使用简单的数字序列数据集进行训练和预测。以下是所有相关的代码文件:

  1. 数据生成脚本

    (generate_data.py)

  2. 基本组件代码

    (components.py)

  3. Encoder和Decoder层代码

    (encoder_decoder.py)

  4. 完整的Transformer模型代码

    (transformer_model.py)

  5. 训练代码

    (train_transformer.py)

  6. 预测代码

    (predict_transformer.py)

如何学习大模型

下面这些都是我当初辛苦整理和花钱购买的资料,现在我已将重要的AI大模型资料包括市面上AI大模型各大白皮书、AGI大模型系统学习路线、AI大模型视频教程、实战学习,等录播视频免费分享出来,需要的小伙伴可以扫取。

现在社会上大模型越来越普及了,已经有很多人都想往这里面扎,但是却找不到适合的方法去学习。

作为一名资深码农,初入大模型时也吃了很多亏,踩了无数坑。现在我想把我的经验和知识分享给你们,帮助你们学习AI大模型,能够解决你们学习中的困难。

一、AGI大模型系统学习路线

很多人学习大模型的时候没有方向,东学一点西学一点,像只无头苍蝇乱撞,我下面分享的这个学习路线希望能够帮助到你们学习AI大模型。

在这里插入图片描述

二、AI大模型视频教程

在这里插入图片描述

三、AI大模型各大学习书籍!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

四、AI大模型各大场景实战案例

在这里插入图片描述

五、AI大模型面试题库

在这里插入图片描述

六、结束语

学习AI大模型是当前科技发展的趋势,它不仅能够为我们提供更多的机会和挑战,还能够让我们更好地理解和应用人工智能技术。通过学习AI大模型,我们可以深入了解深度学习、神经网络等核心概念,并将其应用于自然语言处理、计算机视觉、语音识别等领域。同时,掌握AI大模型还能够为我们的职业发展增添竞争力,成为未来技术领域的领导者。

再者,学习AI大模型也能为我们自己创造更多的价值,提供更多的岗位以及副业创收,让自己的生活更上一层楼。

因此,学习AI大模型是一项有前景且值得投入的时间和精力的重要选择。

深入理解 Transformer 结构,此篇 PyTorch 实现为你解惑 ——PyTorch 实现 Transformer 应用实例展示 (全套教程文末领取哈)从大模型系统设计入手,讲解大模型的主要方法;在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;以SD多模态大模型为主,搭建了文生图小程序案例;以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。 阅读详情

相关推荐

手把手教你用Pytorch代码实现Transformer模型(超详细的代码解读)

本文整理了非常清楚的Transformer模型结构图,建议大家在看代码的时候能结合这个结构图来理解,这样理解起来会比较容易! 用Pytorch实现Transformer的完整代码

捡起一束光的博客 7万+

Transformer模型代码(详细注释,适合新手)

本文提供了transformer代码附带详细注释,要注意本文的transformer并非传统的encoder-decoder结构的,而是主流的gpt结构(decoder-only),不了解decoder-only的同学,可以参考我的另一篇文章,链接放在最后。我过几天会出一个介绍gpt模型结构的的文章,欢迎大家前来讨论。

SWZ156的博客 5075

Transformer实战(15)——使用PyTorch微调Transformer语言模型

本节通过 DistilBert 的微调,介绍了使用 PyToch 从加载预训练模型、手动构建优化器,到实现前向与反向传播、管理梯度,展示了使用 PyTorch 微调 Transformer 语言模型的完整流程。我们演示了如何定义 Dataset 与 DataLoader,并利用 SST-2 数据集完成多轮训练与评估,最终取得约 90.94% 的验证准确率。

盼小辉丶的博客 3633

Transformer代码完全解读!

↑↑↑关注后"星标"Datawhale每日干货&每月组队学习,不错过Datawhale干货作者:安晟&闫永强,Datawhale成员本篇正文部分约1...

Datawhale 7002

transformer模型详解

本文主要讲解了抛弃之前传统的encoder-decoder模型必须结合cnn或者rnn的固有模式,只用Attention。希望对您的学习有所帮助。本文来自网络,由火龙果软件刘琛编辑推荐AttentionIsAllYouNeed这篇论文主要介绍了一种新的机器翻译模型,该模型开创性的使用了很多全新的计算模式和模型结构。综合分析了现有的主流的nlp翻译模型的即基于CNN的可并行对其文本翻译和基于RNN的LSTM门控长短期记忆时序翻译模型,总结了两个模型的优缺点并在此基础上提出了基于自注意力机制的翻译模型transformer,transformer模型没有使用CNN和RNN的方法和模块,开创性的将注

小白跑WRF第五天,安装WPS和静态地理数据

小白跑WRF第四天,安装WPS一、WPS简介二、下载和安装WPSV4.0第一步、进入Build_WRF文件夹第二步、下载WPSV4.0第三步、解压WPS安装包第四步、修改intmath.f(必须执行)第五步、安装WPS三、修改namelist.wps 一、WPS简介 二、下载和安装WPSV4.0 第一步、进入Build_WRF文件夹 cd Build_WRF 第二步、下载WPSV4.0 下载WPSV4.0的安装包有以下三种方式: 利用Linux命令下载。 进入网站https://www2.mmm.uca

weixin_42372313的博客 2万+

Transformer结构解析(附源代码)

保姆级transformer结构解析

君子不怨的小梦想 4594

Win10/Win11共享打印机0x00000709终极修复指南:从注册表到LPD协议的全面解决方案

本文提供了Win10/Win11共享打印机0x00000709错误的终极修复指南,涵盖从注册表修改到LPD协议的全面解决方案。通过详细分析错误根源、基础修复四步法、高阶LPD协议方案及企业级深度修复策略,帮助用户彻底解决打印机共享问题,提升局域网打印效率。

weixin_33724046的博客 311

机器学习周报第36周 AT-LSTM

本周阅读了题为Water Quality Prediction Based on LSTM and Attention Mechanism: A Case Study of the Burnett River, Australia的论文。这项工作提出了一种基于长期短期记忆的神经网络和 注意力机制的混合模型——AT-LSTM。其中,LSTM缺乏对子窗口特征进行不同程度关注的能力,这可能会导致一些相关信息被忽略,无法重视时间序列的重要特征。

weixin_44162879的博客 1129

顺序功能图基本结构

顺序功能图(Sequential Function Chart,SFC)是一种用于描述工业控制系统中顺序控制流程的图形化编程语言,广泛应用于PLC(可编程逻辑控制器)编程。其核心思想是将复杂的控制流程分解为多个有序的步骤,通过逻辑条件实现步骤间的切换。顺序功能图通过图形化的方式简化了复杂控制逻辑的设计,尤其适用于需要严格顺序控制的工业自动化场景。[初始步] → 转换条件1 → [步1] → 转换条件2 → [步2] → ...[步X] → → [步B] → 转换条件B → → [合并步]

ayingqin1的博客 1226

YOLOv11 改进 | 模块即插即用

YOLOv11 是一种单阶段目标检测算法,其核心设计目标在于实现检测速度与精度的平衡。其架构延续了 YOLO 系列“端到端”检测的思路,通过统一的网络结构完成特征提取、多尺度特征融合及最终的边界框预测与分类任务。骨干网络(Backbone)颈部网络(Neck)和检测头(Head)。骨干网络负责从输入图像中提取多层次的语义特征。

u012133341的博客 3122

大语言模型实战(四)——Transformer 网络架构源码剖析

实际使用中,Input Embedding的输出会与“位置编码(Positional Encoding)”的输出相加,得到最终的输入向量(既包含单词语义,又包含位置信息),再送入编码器。Encoder(编码器)是Transformer的“语义提取模块”,负责将输入文本(如待翻译的句子)编码为包含全局语义信息的特征向量,为后续的解码器提供输入。,核心作用是将离散的单词索引(如“苹果”对应索引100)转换为连续的、固定维度的稠密向量(词向量),为后续的注意力计算、特征提取提供可数值化的输入。

swpucwf的博客 1274

TypeError: XGBClassifier.fit() got an unexpected keyword argument ‘early_stopping_rounds‘ 解决方案

本文主要介绍了TypeError: XGBClassifier.fit() got an unexpected keyword argument 'early_stopping_rounds’解决方案,希望能对使用XGBoost的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 1万+

使用PyTorch来实现一个原版transformer代码模型,及样例数据,如何进行完整的训练和预测。用代码教你更深度地了解transformer的原理与实现

使用PyTorch来实现一个原版transformer代码模型,及样例数据,如何进行完整的训练和预测。用代码教你更深度地了解transformer的原理与实现

2401_88440984的博客 1200

【运动规划算法项目实战】Artificial Potential Field算法(附ROS C++代码)

在机器人行业中,路径规划是一个关键的任务,它涉及到如何让机器人在复杂的环境中安全而高效地移动。人工势场算法(Artificial Potential Field Algorithm)是一种常用的路径规划方法,它借鉴了物理学中的势能概念,通过模拟力的作用来引导机器人的移动。本文将详细介绍人工势场算法的原理、在路径规划中的应用、算法优缺点以及代码实现。人工势场算法基于两种势场:斥力场和引力场。斥力场使机器人远离障碍物,而引力场将机器人吸引到目标位置。

xiewf的博客 1万+

大模型——CoPaw:阿里云通义推出的个人智能体工作台,让 AI 助理真正落地

阿里云通义实验室于2026年2月发布CoPaw个人智能助理,采用"本地+云端"双部署模式,支持多平台接入和技能扩展。该产品基于AgentScope多智能体生态构建,具备极简部署、长期记忆系统和灵活的技能插件体系三大核心特性。用户可通过简单命令快速安装,并通过记忆文件系统实现个性化交互体验。CoPaw还支持钉钉、飞书等主流平台接入,并开源了模块化架构,允许本地模型接入。技术架构采用多频道对话网关与可插拔Skills系统,为用户提供真正的AI助理服务体验。

2133

PyTorch实现一个原版transformer代码模型 及样例数据,如何进行完整的训练和预测。用代码教你更深度地了解transformer的原理与实现

PyTorch实现一个原版transformer代码模型 及样例数据,如何进行完整的训练和预测。用代码教你更深度地了解transformer的原理与实现

QQ_1309399183的博客 203

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Transformer模型入门详解及代码实现

本文对Transformer模型的基本原理做了入门级的介绍,意在为读者描述整体思路,而并非拘泥于细微处的原理剖析,并附上了基于PYTORCH实现的Transformer模型代码及详细讲解。

cuguanren的博客 1万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Vision Transformer (ViT)模型与代码实现(PyTorch)

文章目录摘要一. Visual Transformer (ViT)模型1.1 ViT模型整体结构1.2小结二. VIT 代码实现PyTorch版本 摘要 一. Visual Transformer (ViT)模型 论文源地址:https://arxiv.org/abs/2010.11929 参考博客地址:VIT详细讲解 1.1 ViT模型整体结构 ViT模型是基于Transformer的模型在CV视觉领域的开篇之作,本篇将尽可能简洁地介绍一下ViT模型的整体架构以及基本原理。ViT模型是基于Transfor

weixin_44790306的博客 1万+

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

transformer在图像分类上的应用以及pytorch代码实现

文章目录1.对transformers的简单介绍1.1序列数据的介绍(seq2seq)1.2self-Attention1.3 transformer的完整结构2.transformers在图像分类上的pytorch代码2.1加载cifar10数据集2.2构建transformers模型2.2.1构建图像编码模块 Embeddings2.2.3构建前向传播神经网络模块2.2.4构建编码器的可重复利用Block模块2.2.5构建Encoder模块2.2.6 构建完整的transformers2.2.7构建Vi

qq_37937847的博客 5万+

Transformer 代码详解(Pytorch版)

前言 基于上一篇经典网络架构学习-Transformer的学习,今天我们来使用pytorch 搭建自己的transformer模型,加深对transformer的理解,不仅在NLP领域绕不开transformer,而且在CV领域也是很火热,很多模型都用到了注意力机制。 Transformer完整代码 安装好pytorch开发环境,可以直接跑的。也可以直接用cpu跑我下面的transformer代码,数据集比较小,在2G内存就够了。 # ===============================

一璐有你的专栏 6万+
上一篇: 吴恩达新书封神!吹爆这份最真实的AI求职指南《如何构建自己的AI职业》
下一篇: 从入门到精通Transformer,掌握NLP技术这本书必看《从零开始构建最先进的NLP模型》
我爱学大模型
博客等级 码龄3年 7883粉丝 687原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值