使用transfomrer的编码器实现minist数字识别

1.数据预处理

import torch
import torch.nn as nn
import torch.optim as optim

from torchvision import datasets,transforms
from torch.utils.data import DataLoader

transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.1307,), (0.3081,))
])

train_dataset = datasets.MNIST('./data', train=True, download=True, transform=transform)
test_dataset = datasets.MNIST('./data', train=False, transform=transform)

train_loader = DataLoader(train_dataset, batch_size=16, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=1000, shuffle=False)

2. 定义transformer模型

class TransformerModel(nn.Module):
    def __init__(self, input_dim, num_classes,n_heads=4,num_encoder_layers=3):
        super(TransformerModel, self).__init__()
        self.positional_encoding=nn.Parameter(torch.zeros(1, 28, 28))
        encoder_layers=self.transformer=nn.TransformerEncoderLayer(d_model=28,nhead=n_heads)
        self.transformer_encoder = nn.TransformerEncoder(encoder_layers, num_layers=num_encoder_layers)
        self.fc = nn.Linear(28, num_classes)
        
    def forward(self,x):
        #batch_size为16,图片是28×28,这里 x  torch.Size([16, 1, 28, 28])
        x=x.view(x.size(0),28,28)   #torch.Size([16,  28, 28])
        pos_enc = self.positional_encoding
        x+= pos_enc
        x = x.permute(1, 0, 2)  # 转换为trans需要 (sequence_length, batch_size, embedding_dim)
        x=self.transformer_encoder(x)        #torch.Size([28 ,16, 28])
        x=x.mean(dim=0)                      #[sequence_length, batch_size, embedding_dim]
        x=self.fc(x)
        return x                         #torch.Size([16,10])    [batch_size,num_classes]
model = TransformerModel(input_dim=28, num_classes=10)
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)    

3. 训练

def train(model,train_loader,criterion,optimizer,epoch):
    model.train()
    for batch_idx, (data, target) in enumerate(train_loader):
        optimizer.zero_grad()
        output = model(data)
        loss = criterion(output, target)
        loss.backward()
        optimizer.step()
        if batch_idx % 100 == 0:
            print(f'Train Epoch: {epoch} [{batch_idx * len(data)}/{len(train_loader.dataset)}'
                  f' ({100. * batch_idx / len(train_loader):.0f}%)]\tLoss: {loss.item():.6f}')
# 训练和评估
for epoch in range(1, 11):
    train(model, train_loader, criterion, optimizer, epoch)

训练结果:
在这里插入图片描述

4.测试

#torch.save(model.state_dict(), './model/model_minist.pth')
# model.load_state_dict(torch.load('model.pth'))
def test(model, test_loader, criterion):
    model.eval()
    test_loss = 0
    correct = 0
    with torch.no_grad():
        for data, target in test_loader:
            output = model(data)
            test_loss += criterion(output, target).item()  # sum up batch loss
            pred = output.argmax(dim=1, keepdim=True)  
            correct += pred.eq(target.view_as(pred)).sum().item()

    test_loss /= len(test_loader.dataset)
    print(f'\nTest set: Average loss: {test_loss:.4f}, Accuracy: {correct}/{len(test_loader.dataset)}'
          f' ({100. * correct / len(test_loader.dataset):.0f}%)\n')

# 训练和评估

test(model, test_loader, criterion)

5.测试单张图片的可视化

from PIL import Image
import matplotlib.pyplot as plt
model = TransformerModel(input_dim=28, num_classes=10)
model.load_state_dict(torch.load('C:\\Users\\xxxxx\\Desktop\\code\\transformer\\tran_minisit\\pythonProject\\model\\model_minist.pth'))
model.eval()
image_path="08.jpg"
image = Image.open(image_path).convert('L') 


input_size = 28 
transform = transforms.Compose([
    transforms.Resize((input_size, input_size)),
    transforms.ToTensor(),
    transforms.Normalize((0.5,), (0.5,))
])
image_tensor = transform(image).unsqueeze(0)  # 添加 batch_size

# 3. 执行推断
with torch.no_grad():
    output = model(image_tensor)
    output_logits = output.squeeze().numpy()
    output_probs = torch.nn.functional.softmax(output, dim=1).squeeze().numpy()

    # 打印模型预测的原始值和概率
    print("模型原始输出(logits):", output_logits)
    print("预测概率:", output_probs)

# 4. 可视化输入图像和预测结果
plt.figure(figsize=(14, 6))

# 输入图像
plt.subplot(1, 3, 1)
plt.title("Input Image")
plt.imshow(image, cmap='gray')

# 模型原始输出(logits)
plt.subplot(1, 3, 2)
plt.title("Model Logits")
plt.bar(range(len(output_logits)), output_logits)
plt.xlabel('Class')
plt.ylabel('Logit Value')

# 预测概率
plt.subplot(1, 3, 3)
plt.title("Prediction Probabilities")
plt.bar(range(len(output_probs)), output_probs)
plt.xlabel('Class')
plt.ylabel('Probability')

plt.tight_layout()
plt.show()

结果:
在这里插入图片描述

  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
很高兴听到您想要实现一个手写神经网络来识别minist手写数字。以下是一个基本的Python代码实现: 首先,我们需要导入必要的库: ```python import numpy as np import matplotlib.pyplot as plt import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data ``` 然后,我们需要加载minist数据集: ```python mnist = input_data.read_data_sets("MNIST_data/", one_hot=True) ``` 接着,我们需要定义我们的神经网络模型。我们将使用一个三层的全连接网络,其中第一层有784个输入神经元(对应于MNIST图像的像素数量),第二层有256个隐藏神经元,第三层有10个输出神经元(对应于10个数字分类)。 ```python # 定义网络参数 n_input = 784 n_hidden_1 = 256 n_classes = 10 # 定义占位符 x = tf.placeholder("float", [None, n_input]) y = tf.placeholder("float", [None, n_classes]) # 定义权重和偏置 weights = { 'h1': tf.Variable(tf.random_normal([n_input, n_hidden_1])), 'out': tf.Variable(tf.random_normal([n_hidden_1, n_classes])) } biases = { 'b1': tf.Variable(tf.random_normal([n_hidden_1])), 'out': tf.Variable(tf.random_normal([n_classes])) } # 定义网络结构 def multilayer_perceptron(x, weights, biases): # 第一层隐藏层 layer_1 = tf.add(tf.matmul(x, weights['h1']), biases['b1']) layer_1 = tf.nn.relu(layer_1) # 输出层 out_layer = tf.matmul(layer_1, weights['out']) + biases['out'] return out_layer # 定义模型 pred = multilayer_perceptron(x, weights, biases) ``` 然后,我们需要定义我们的损失函数和优化器。我们将使用交叉熵损失函数和Adam优化器。 ```python # 定义损失函数和优化器 cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=pred, labels=y)) optimizer = tf.train.AdamOptimizer(learning_rate=0.001).minimize(cost) ``` 接下来,我们定义训练模型的参数。我们将使用100个批次,每个批次大小为128。 ```python # 定义训练参数 training_epochs = 100 batch_size = 128 display_step = 1 ``` 现在,我们可以开始训练我们的模型。我们将迭代训练数据集100次,并在每次迭代后计算损失和准确率。 ```python # 启动会话 with tf.Session() as sess: sess.run(tf.global_variables_initializer()) # 训练循环 for epoch in range(training_epochs): avg_cost = 0. total_batch = int(mnist
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大泽泽的小可爱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值