MNIST数据集上卷积神经网络的简单实现(使用PyTorch)

设计的CNN模型包括一个输入层,输入的是MNIST数据集中28*28*1的灰度图

两个卷积层,

第一层卷积层使用6个3*3的kernel进行filter,步长为1,填充1.这样得到的尺寸是(28+1*2-3)/1+1=28,即6个28*28的feature map

在后面进行池化,尺寸变为14*14

第二层卷积层使用16个5*5的kernel,步长为1,无填充,得到(14-5)/1+1=10,即16个10*10的feature map

池化后尺寸为5*5

后面加两层全连接层,第一层将16*5*5=400个神经元线性变换为120个,第二层将120个变为84个

最后的输出层将84个输出为10个种类

代码如下:

###MNIST数据集上卷积神经网络的简单实现###

# 配置库
import torch
from torch import nn, optim
import torch.nn.functional as F
from torch.autograd import Variable
from torch.utils.data import DataLoader
from torchvision import transforms
from torchvision import datasets

# 配置参数
torch.manual_seed(1)  # 设置随机数种子,确保结果可重复
batch_size = 128  # 批处理大小
learning_rate = 1e-2  # 学习率
num_epoches = 10  # 训练次数

# 加载MNIST数据
# 下载训练集MNIST手写数字训练集
train_dataset = datasets.MNIST(
    root=‘./data‘,  # 数据保持的位置
    train=True,  # 训练集
    transform=transforms.ToTensor(),  # 一个取值范围是【0,255】的PIL.Image
    # 转化成取值范围是[0,1.0]的torch.FloatTensor
    download=True
)
test_dataset = datasets.MNIST(
    root=‘./data‘,
    train=False,  # 测试集
    transform=transforms.ToTensor()
)
# 数据的批处理中,尺寸大小为batch_size
# 在训练集中,shuffle必须设置为True,表示次序是随机的
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False)

# 创建CNN模型
# 使用一个类来创建,这个模型包括1个输入层,2个卷积层,2个全连接层和1个输出层。
# 其中卷积层构成为卷积(conv2d)->激励函数(ReLU)->池化(MaxPooling)
# 全连接层由线性层(Linear)构成

# 定义卷积神经网络模型
class Cnn(nn.Module):
    def __init__(self, in_dim, n_class):  # 28*28*1
        super(Cnn, self).__init__()
        self.conv = nn.Sequential(
            nn.Conv2d(in_dim, 6, 3, stride=1, padding=1),  # 28*28
            nn.ReLU(True),
            nn.MaxPool2d(2, 2),  # 14*14
            nn.Conv2d(6, 16, 5, stride=1, padding=0),  # 10*10*16
            nn.ReLU(True),
            nn.MaxPool2d(2, 2)  # 5*5*16
        )
        self.fc = nn.Sequential(
            nn.Linear(400, 120),
            nn.Linear(120, 84),
            nn.Linear(84, n_class)
        )

    def forward(self, x):
        out = self.conv(x)
        out = out.view(out.size(0), 400)  # 400=5*5*16
        out = self.fc(out)
        return out

# 图片大小是28*28,10是数据的种类
model = Cnn(1, 10)
# 打印模型,呈现网络结构
print(model)

# 模型训练,将img\label都用Variable包装起来,放入model中计算out,最后计算loss和正确率

# 定义loss和optimizer
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=learning_rate)

# 开始训练
for epoch in range(num_epoches):
    running_loss = 0.0
    running_acc = 0.0
    for i, data in enumerate(train_loader, 1):  # 批处理
        img, label = data
        img = Variable(img)
        label = Variable(label)
        # 前向传播
        out = model(img)
        loss = criterion(out, label)  # loss
        running_loss += loss.item() * label.size(0)
        # total loss,由于loss是batch取均值的,需要把batch_size乘进去
        _, pred = torch.max(out, 1)  # 预测结果
        num_correct = (pred == label).sum()  # 正确结果的数量
        #accuracy = (pred == label).float().mean()  # 正确率
        running_acc += num_correct.item()  # 正确结果的总数
        # 后向传播
        optimizer.zero_grad()  # 梯度清零,以免影响其他batch
        loss.backward()  # 后向传播,计算梯度
        optimizer.step()  # 利用梯度更新W,b参数

    # 打印一个循环后,训练集合上的loss和正确率
    print(‘Train {} epoch, Loss:{:.6f},Acc:{:.6f}‘.format(epoch + 1, running_loss / (len(train_dataset)),
                                                          running_acc / (len(train_dataset))))

# 在测试集上测试识别率
# 模型测试
model.eval()
# 由于训练和测试BatchNorm,Dropout配置不同,需要说明是否模型测试
eval_loss = 0
eval_acc = 0
for data in test_loader:  # test set批处理
    img, label = data
    with torch.no_grad():
        img = Variable(img)
    # volatile确定你是否调用.backward(),
    # 测试中不需要label=Variable(label,volatile=True)
    #不需要梯度更新改为with torch.no_grad()
    out = model(img)
    loss = criterion(out, label)  # 计算loss
    eval_loss += loss.item() * label.size(0)  # total loss
    _, pred = torch.max(out, 1)  # 预测结果
    num_correct = (pred == label).sum()  # 正确结果
    eval_acc += num_correct.item()  # 正确结果总数
print(‘Test loss:{:.6f},Acc:{:.6f}‘.format(eval_loss / (len(test_dataset)), eval_acc * 1.0 / (len(test_dataset))))

  

原文地址:https://www.cnblogs.com/candyRen/p/12073017.html

时间: 2024-08-01 10:20:00

MNIST数据集上卷积神经网络的简单实现(使用PyTorch)的相关文章

cuda-convnet 在其他数据集上的使用教程

cuda-convnet 是Alex Krizhevsky公开的一套CNN代码,运行于Linux系统上,使用GPU做运算,在cuda-convnet中仅仅提供了Cifar数据集的demo,并且网站上并没有说明cuda-convnet代码是如何用于其它数据库的,所以博主我就尝试修改源码,以用于MNIST数据集上,做一个手写数字的识别CNNdemo 文章分三个部分: 首先,IO模块 其次,修改Layer的参数 最后是里面一些Python文件的说明,博主我也是为了这套代码才学习的Python与Cuda

Tensorflow卷积神经网络[转]

Tensorflow卷积神经网络 卷积神经网络(Convolutional Neural Network, CNN)是一种前馈神经网络, 在计算机视觉等领域被广泛应用. 本文将简单介绍其原理并分析Tensorflow官方提供的示例. 关于神经网络与误差反向传播的原理可以参考作者的另一篇博文BP神经网络与Python实现. 工作原理 卷积是图像处理中一种基本方法. 卷积核是一个nxn的矩阵通常n取奇数, 这样矩阵就有了中心点和半径的概念. 对图像中每个点取以其为中心的n阶方阵, 将该方阵与卷积核中

经典的卷积神经网络及其Pytorch代码实现

1.LeNet LeNet是指LeNet-5,它是第一个成功应用于数字识别的卷积神经网络.在MNIST数据集上,可以达到99.2%的准确率.LeNet-5模型总共有7层,包括两个卷积层,两个池化层,两个全连接层和一个输出层. import torch import torch.nn as nn from torch.autograd import Variable #方形卷积核和等长的步长 m1=nn.Conv2d(16,33,3,stride=2) #非长方形卷积核,非等长的步长和边界填充 m

卷积神经网络(CNN)学习笔记1:基础入门

卷积神经网络(CNN)学习笔记1:基础入门 Posted on 2016-03-01   |   In Machine Learning  |   9 Comments  |   14935  Views 概述 卷积神经网络(Convolutional Neural Network, CNN)是深度学习技术中极具代表的网络结构之一,在图像处理领域取得了很大的成功,在国际标准的ImageNet数据集上,许多成功的模型都是基于CNN的.CNN相较于传统的图像处理算法的优点之一在于,避免了对图像复杂的

caffe在windows编译工程及运行mnist数据集测试

caffe在windows上的配置和编译可以参考如下的博客: http://blog.csdn.net/joshua_1988/article/details/45036993 http://blog.csdn.net/joshua_1988/article/details/45048871 http://blog.csdn.net/dongb5lz/article/details/45171187 http://m.blog.csdn.net/blog/thesby/43535619 按照上面

【TensorFlow/简单网络】MNIST数据集-softmax、全连接神经网络,卷积神经网络模型

初学tensorflow,参考了以下几篇博客: soft模型 tensorflow构建全连接神经网络 tensorflow构建卷积神经网络 tensorflow构建卷积神经网络 tensorflow构建CNN[待学习] 全连接+各种优化[待学习] BN层[待学习] 先解释以下MNIST数据集,训练数据集有55,000 条,即X为55,000 * 784的矩阵,那么Y为55,000 * 10的矩阵,每个图片是28像素*28像素,带有标签,Y为该图片的真实数字,即标签,每个图片10个数字,1所在位置

卷积神经网络(CNN)的简单实现(MNIST)

卷积神经网络(CNN)的基础介绍见http://blog.csdn.net/fengbingchun/article/details/50529500,这里主要以代码实现为主. CNN是一个多层的神经网络,每层由多个二维平面组成,而每个平面由多个独立神经元组成. 以MNIST作为数据库,仿照LeNet-5和tiny-cnn( http://blog.csdn.net/fengbingchun/article/details/50573841 ) 设计一个简单的7层CNN结构如下: 输入层Inpu

TensorFlow训练MNIST数据集(3) —— 卷积神经网络

前面两篇随笔实现的单层神经网络 和多层神经网络, 在MNIST测试集上的正确率分别约为90%和96%.在换用多层神经网络后,正确率已有很大的提升.这次将采用卷积神经网络继续进行测试. 1.模型基本结构 如下图所示,本次采用的模型共有8层(包含dropout层).其中卷积层和池化层各有两层. 在整个模型中,输入层负责数据输入:卷积层负责提取图片的特征:池化层采用最大池化的方式,突出主要特征,并减少参数维度:全连接层再将个特征组合起来:dropout层可以减少每次训练的计算量,并可以一定程度上避免过

吴裕雄 python 神经网络——TensorFlow 使用卷积神经网络训练和预测MNIST手写数据集

import tensorflow as tf import numpy as np from tensorflow.examples.tutorials.mnist import input_data #设置输入参数 batch_size = 128 test_size = 256 # 初始化权值与定义网络结构,建构一个3个卷积层和3个池化层,一个全连接层和一个输出层的卷积神经网络 # 首先定义初始化权重函数 def init_weights(shape): return tf.Variabl