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盲盒。
相关文章
|
1月前
|
机器学习/深度学习 编解码 自动驾驶
RT-DETR改进策略【模型轻量化】| 替换骨干网络为MoblieNetV1,用于移动视觉应用的高效卷积神经网络
RT-DETR改进策略【模型轻量化】| 替换骨干网络为MoblieNetV1,用于移动视觉应用的高效卷积神经网络
44 3
RT-DETR改进策略【模型轻量化】| 替换骨干网络为MoblieNetV1,用于移动视觉应用的高效卷积神经网络
|
1月前
|
机器学习/深度学习 编解码 自动驾驶
YOLOv11改进策略【模型轻量化】| 替换骨干网络为MoblieNetV1,用于移动视觉应用的高效卷积神经网络
YOLOv11改进策略【模型轻量化】| 替换骨干网络为MoblieNetV1,用于移动视觉应用的高效卷积神经网络
87 16
YOLOv11改进策略【模型轻量化】| 替换骨干网络为MoblieNetV1,用于移动视觉应用的高效卷积神经网络
|
1月前
|
机器学习/深度学习 存储 大数据
RT-DETR改进策略【Backbone/主干网络】| ICLR-2023 替换骨干网络为:RevCol 一种新型神经网络设计范式
RT-DETR改进策略【Backbone/主干网络】| ICLR-2023 替换骨干网络为:RevCol 一种新型神经网络设计范式
48 11
RT-DETR改进策略【Backbone/主干网络】| ICLR-2023 替换骨干网络为:RevCol 一种新型神经网络设计范式
|
1月前
|
机器学习/深度学习 存储 大数据
YOLOv11改进策略【Backbone/主干网络】| ICLR-2023 替换骨干网络为:RevCol 一种新型神经网络设计范式
YOLOv11改进策略【Backbone/主干网络】| ICLR-2023 替换骨干网络为:RevCol 一种新型神经网络设计范式
66 0
YOLOv11改进策略【Backbone/主干网络】| ICLR-2023 替换骨干网络为:RevCol 一种新型神经网络设计范式
|
1月前
|
存储 机器学习/深度学习 人工智能
2025年阿里云GPU服务器租用价格、选型策略与应用场景详解
随着AI与高性能计算需求的增长,阿里云提供了多种GPU实例,如NVIDIA V100、A10、T4等,适配不同场景。2025年重点实例中,V100实例GN6v单月3830元起,适合大规模训练;A10实例GN7i单月3213.99元起,适用于混合负载。计费模式有按量付费和包年包月,后者成本更低。针对AI训练、图形渲染及轻量级推理等场景,推荐不同配置以优化成本和性能。阿里云还提供抢占式实例、ESSD云盘等资源优化策略,支持eRDMA网络加速和倚天ARM架构,助力企业在2025年实现智能计算的效率与成本最优平衡。 (该简介为原文内容的高度概括,符合要求的字符限制。)
|
20天前
|
边缘计算 调度 对象存储
部署DeepSeek但IDC GPU不足,阿里云ACK Edge虚拟节点来帮忙
介绍如何使用ACK Edge与虚拟节点满足DeepSeek部署的弹性需求。
|
16天前
|
人工智能 云计算 数据中心
阿里云当选UALink联盟董事会成员,推进新一代GPU互连技术!
阿里云当选UALink联盟董事会成员,推进新一代GPU互连技术!
38 2
|
1月前
|
机器学习/深度学习 存储 人工智能
2025年阿里云GPU服务器的租赁价格与选型指南
随着AI、深度学习等领域的发展,GPU服务器成为企业及科研机构的核心算力选择。阿里云提供多种GPU实例类型(如NVIDIA V100、A100等),涵盖计算型、共享型和弹性裸金属等,满足不同场景需求。本文详解2025年阿里云GPU服务器的核心配置、价格策略及适用场景,帮助用户优化选型与成本控制,实现高效智能计算。
|
1月前
|
机器学习/深度学习 存储 弹性计算
阿里云gpu云服务器租用价格:最新收费标准及活动价格参考
阿里云gpu云服务器多少钱?A10卡GN7i GPU云服务器32核188G3213.99/1个月起,V100卡GN6v GPU云服务器8核32G3830.00/1个月起,阿里云GPU云服务器是基于GPU应用的计算服务,多适用于视频解码,图形渲染,深度学习,科学计算等应用场景,该产品具有超强计算能力、网络性能出色、购买方式灵活、高性能实例存储( GA1和GN5特有)等特点。下面小编来介绍下阿里云gpu云服务器最新的收费标准及活动价格。
|
13天前
|
边缘计算 调度 对象存储
部署DeepSeek但IDC GPU不足,阿里云ACK Edge虚拟节点来帮忙
部署DeepSeek但IDC GPU不足,阿里云ACK Edge虚拟节点来帮忙

热门文章

最新文章