Pytorch 搭建卷积神经网络CNN和循环神经网络RNN在GPU上预测MNIST数据集

简介: Pytorch 搭建卷积神经网络CNN和循环神经网络RNN在GPU上预测MNIST数据集

卷积神经网络CNN

import torch
import torch.nn as nn
from torch.autograd import Variable
import matplotlib.pyplot as plt
import torch.utils.data as Data
import torchvision
# 下载MNIST数据集
# 若已有该数据集,需改为DOWNLOAD_MNIST = False
DOWNLOAD_MNIST = True
train_data = torchvision.datasets.MNIST(
    root='./mnist',
    train=True,
    transform=torchvision.transforms.ToTensor(),
    download = DOWNLOAD_MNIST
)
test_data = torchvision.datasets.MNIST(root='./mnist/',train=False)
with torch.no_grad():
    test_x = Variable(torch.unsqueeze(test_data.data, dim=1)).type(torch.FloatTensor).cuda()
test_y = test_data.targets[:10000].cuda()
# 配置批处理
train_loader = Data.DataLoader(
    dataset=train_data,
    batch_size=50,
    shuffle=True,
    num_workers=3
)
# CNN网络
class CNN(nn.Module):
    def __init__(self):
        super(CNN, self).__init__()
        # 第一个卷积层
        self.conv1 = nn.Sequential(
            nn.Conv2d(# 原图(1, 28, 28)
                in_channels=1,
                out_channels=16,
                kernel_size=5,
                stride=1,
                padding=2 # (kernel_size-1)/2
            ),# (1, 28, 28) -> (16, 28, 28)
            nn.ReLU(),
            nn.MaxPool2d(kernel_size=2) # (16, 28, 28) -> (16, 14, 14)
        )
        # 第二个卷积层
        self.conv2 = nn.Sequential(
            nn.Conv2d(16, 32, 5, 1, 2),
            nn.ReLU(),
            nn.MaxPool2d(2)
        )# (16, 14, 14) -> (32, 7, 7)
        self.out = nn.Linear(32 * 7 * 7, 10)
    def forward(self, x):
        x = self.conv1(x)
        x = self.conv2(x)
        x = x.view(x.size(0), -1)
        output = self.out(x)
        return output
cnn = CNN().cuda()
# 配置网络优化器
optimizer = torch.optim.Adam(cnn.parameters(), lr = 0.001)
loss_func = nn.CrossEntropyLoss()
plt.ion()
plt.show()
plt.figure()
steplist = []
losslist = []
accuracylist = []
for epoch in range(1):
    for step, (x, y) in enumerate(train_loader):
        b_x = Variable(x).cuda()
        b_y = Variable(y).cuda()
        output = cnn(b_x)
        loss = loss_func(output, b_y)
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
        if step % 10 == 0:
            test_output = cnn(test_x[:10000])
            pred_y = torch.max(test_output, 1)[1].cpu().data.numpy().squeeze()
            accuracy = sum(pred_y == test_y.cpu().numpy()) / test_y.size(0)
            print('Epoch:', epoch, ' | train loss:%.4f'%loss.item(), ' | test accuracy:%.2f'%accuracy)
            steplist.append(step)
            losslist.append(loss.item())
            accuracylist.append(accuracy)
            plt.subplot(121)
            plt.title('loss')
            plt.plot(steplist, losslist, 'r-', lw=1)
            plt.subplot(122)
            plt.title('accuracy')
            plt.plot(steplist, accuracylist, 'b-', lw=1)
            plt.pause(0.1)
plt.ioff()
plt.show()


结果:


0a2653c851af460fa595bd959398a8f1.png


Epoch: 0  | train loss:1.4696  | test accuracy:0.69
Epoch: 0  | train loss:0.7815  | test accuracy:0.80
Epoch: 0  | train loss:0.5405  | test accuracy:0.79
...
Epoch: 0  | train loss:0.0603  | test accuracy:0.98
Epoch: 0  | train loss:0.0451  | test accuracy:0.98
Epoch: 0  | train loss:0.0594  | test accuracy:0.98


可以看到,CNN对MNIST数据集的预测能达到98%的准确率,这是一个相当好的结果


整个预测的可视化过程:


2019082413041482.gif


循环神经网络RNN

import torch
import torch.nn as nn
from torch.autograd import Variable
import matplotlib.pyplot as plt
import torch.utils.data as Data
import torchvision
DOWNLOAD_MNIST = True
train_data = torchvision.datasets.MNIST(
    root='./mnist',
    train=True,
    transform=torchvision.transforms.ToTensor(),
    download = DOWNLOAD_MNIST
)
train_loader = Data.DataLoader(
    dataset=train_data,
    batch_size=64,
    shuffle=True,
)
test_data = torchvision.datasets.MNIST(root='./mnist/',train=False)
with torch.no_grad():
    test_x = (torch.unsqueeze(test_data.data, dim=1).type(torch.FloatTensor)/255.).cuda()
test_y = test_data.targets[:10000].cuda()
class RNN(nn.Module):
    def __init__(self):
        super(RNN, self).__init__()
        self.rnn = nn.LSTM(
            input_size=28,
            hidden_size=64,
            num_layers=1,
            batch_first=True
        )
        self.out = nn.Linear(64, 10)
    def forward(self, x):
        r_out, (h_n, h_c) = self.rnn(x, None)
        out = self.out(r_out[:, -1, :]) # (batch, time_step[-1], input_size)
        return out
rnn = RNN().cuda()
optimizer = torch.optim.Adam(rnn.parameters(), lr = 0.001)
loss_func = nn.CrossEntropyLoss()
plt.ion()
plt.show()
plt.figure()
steplist = []
losslist = []
accuracylist = []
for epoch in range(1):
    for step, (x, y) in enumerate(train_loader):
        b_x = Variable(x.view(-1, 28, 28)).cuda()
        b_y = Variable(y).cuda()
        output = rnn(b_x)
        loss = loss_func(output, b_y)
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
        if step % 10 == 0:
            test_output = rnn(test_x[:10000].view(-1, 28, 28))
            pred_y = torch.max(test_output, 1)[1].cpu().data.numpy().squeeze()
            accuracy = sum(pred_y == test_y.cpu().numpy()) / test_y.size(0)
            print('Epoch:', epoch, ' | train loss:%.4f'%loss.item(), ' | test accuracy:%.2f'%accuracy)
            steplist.append(step)
            losslist.append(loss.item())
            accuracylist.append(accuracy)
            plt.subplot(121)
            plt.title('loss')
            plt.plot(steplist, losslist, 'r-', lw=1)
            plt.subplot(122)
            plt.title('accuracy')
            plt.plot(steplist, accuracylist, 'b-', lw=1)
            plt.pause(0.1)
plt.ioff()
plt.show()
test_output = rnn(test_x[:10])
pred_y = torch.max(test_output, 1)[1].cpu().data.numpy().squeeze()
print(pred_y, 'prediction number')
print(test_y[:10].cpu().numpy(), 'real number')


结果:


2d65d23f6d4748949b924e4057485923.png

Epoch: 0  | train loss:2.2996  | test accuracy:0.13
Epoch: 0  | train loss:2.2977  | test accuracy:0.15
Epoch: 0  | train loss:2.2768  | test accuracy:0.21
...
Epoch: 0  | train loss:0.1875  | test accuracy:0.94
Epoch: 0  | train loss:0.2653  | test accuracy:0.94
Epoch: 0  | train loss:0.3055  | test accuracy:0.94
相关实践学习
部署Stable Diffusion玩转AI绘画(GPU云服务器)
本实验通过在ECS上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。
相关文章
|
7天前
|
机器学习/深度学习 计算机视觉 Python
【YOLOv11改进 - 注意力机制】SimAM:轻量级注意力机制,解锁卷积神经网络新潜力
【YOLOv11改进 - 注意力机制】SimAM:轻量级注意力机制,解锁卷积神经网络新潜力本文提出了一种简单且高效的卷积神经网络(ConvNets)注意力模块——SimAM。与现有模块不同,SimAM通过优化能量函数推断特征图的3D注意力权重,无需添加额外参数。SimAM基于空间抑制理论设计,通过简单的解决方案实现高效计算,提升卷积神经网络的表征能力。代码已在Pytorch-SimAM开源。
【YOLOv11改进 - 注意力机制】SimAM:轻量级注意力机制,解锁卷积神经网络新潜力
|
10天前
|
机器学习/深度学习 监控 自动驾驶
卷积神经网络有什么应用场景
【10月更文挑战第23天】卷积神经网络有什么应用场景
13 2
|
10天前
|
机器学习/深度学习 自然语言处理 算法
什么是卷积神经网络
【10月更文挑战第23天】什么是卷积神经网络
17 1
|
13天前
|
机器学习/深度学习 人工智能 算法
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
车辆车型识别,使用Python作为主要编程语言,通过收集多种车辆车型图像数据集,然后基于TensorFlow搭建卷积网络算法模型,并对数据集进行训练,最后得到一个识别精度较高的模型文件。再基于Django搭建web网页端操作界面,实现用户上传一张车辆图片识别其类型。
53 0
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
|
14天前
|
机器学习/深度学习 人工智能 自动驾驶
深度学习中的卷积神经网络(CNN)及其应用
【10月更文挑战第21天】本文旨在深入探讨深度学习领域的核心组成部分——卷积神经网络(CNN)。通过分析CNN的基本结构、工作原理以及在图像识别、语音处理等领域的广泛应用,我们不仅能够理解其背后的技术原理,还能把握其在现实世界问题解决中的强大能力。文章将用浅显的语言和生动的例子带领读者一步步走进CNN的世界,揭示这一技术如何改变我们的生活和工作方式。
|
4天前
|
机器学习/深度学习 人工智能 TensorFlow
深度学习中的卷积神经网络(CNN)及其在图像识别中的应用
【10月更文挑战第32天】本文将介绍深度学习中的一个重要分支——卷积神经网络(CNN),以及其在图像识别领域的应用。我们将通过一个简单的代码示例,展示如何使用Python和TensorFlow库构建一个基本的CNN模型,并对其进行训练和测试。
|
9天前
|
机器学习/深度学习 自然语言处理 TensorFlow
深度学习中的卷积神经网络(CNN)及其应用
【10月更文挑战第26天】在这篇文章中,我们将深入探讨卷积神经网络(CNN)的基本原理、结构和应用。CNN是深度学习领域的一个重要分支,广泛应用于图像识别、语音处理等领域。我们将通过代码示例和实际应用案例,帮助读者更好地理解CNN的概念和应用。
|
12天前
|
机器学习/深度学习 算法 计算机视觉
深度学习与生活:如何利用卷积神经网络识别日常物品
【10月更文挑战第24天】在这篇文章中,我们将探索深度学习如何从理论走向实践,特别是卷积神经网络(CNN)在图像识别中的应用。通过一个简单的示例,我们将了解如何使用CNN来识别日常生活中的物体,如水果和家具。这不仅是对深度学习概念的一次直观体验,也是对技术如何融入日常生活的一次深刻反思。文章将引导读者思考技术背后的哲理,以及它如何影响我们的生活和思维方式。
|
17天前
|
机器学习/深度学习 人工智能 自动驾驶
深入理解深度学习中的卷积神经网络(CNN)
【10月更文挑战第18天】深入理解深度学习中的卷积神经网络(CNN)
27 0
|
20天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于贝叶斯优化卷积神经网络(Bayes-CNN)的多因子数据分类识别算法matlab仿真
本项目展示了贝叶斯优化在CNN中的应用,包括优化过程、训练与识别效果对比,以及标准CNN的识别结果。使用Matlab2022a开发,提供完整代码及视频教程。贝叶斯优化通过构建代理模型指导超参数优化,显著提升模型性能,适用于复杂数据分类任务。
下一篇
无影云桌面