深度学习-卷积神经网络-实例及代码2(初级)—利用Tensorflow和mnist数据集训练简单的深度网络模型实现手写数字识别

系列文章:

深度学习-卷积神经网络-实例及代码0.8—基于最小均方误差的线性判别函数参数拟合训练

深度学习-卷积神经网络-实例及代码0.9—MNIST数据集介绍、下载及基本操作

深度学习-卷积神经网络-实例及代码1(入门)—利用Tensorflow和mnist数据集训练单层前馈神经网络/感知机实现手写数字识别

 

在本文实例中,我们利用Tensorflow框架和mnist数据集训练简单的深度网络模型,即多层卷积神经网络,可以参考TensorFlow的官方文档。

 

1、基础知识准备

(1)深度学习-卷积神经网络的基本原理

卷积层:卷积操作的目的是提取输入的不同特征,第一层卷积层可能只能提取一些低级的特征如边缘、线条和角等层级,更多层的网路能从低级特征中迭代提取更复杂的特征

Relu层:也叫激活函数层,激活函数是用来加入非线性因素的,因为线性模型的表达能力不够

池化层:也叫下采样层,池化层主要用于压缩数据特征,减少参数的计算量,减小过拟合

全连接层:在整个卷积神经网络中起到“分类器”的作用。如果说卷积层、池化层和激活函数层等操作是将原始数据映射到隐层特征空间的话,全连接层则起到将学到的“分布式特征表示”映射到样本标记空间的作用。在实际使用中,全连接层可由卷积操作实现

(2)Tensorflow基础知识

Tensorflow中的计算图、张量、Session的运行等基本概念

Tensorflow中和卷积、Relu、池化、全连接、梯度下降等操作相关的函数使用

即tf.nn.conv2d、tf.nn.max_pool、tf.nn.relu、tf.matmul、tf.train.AdamOptimize、tf.nn.Softmax等方法使用

(3)利用Tensorflow进行训练的相关操作方法

Tensorflow的基本使用方法和神经网络模型训练的基本过程,可参考文章:

   深度学习-卷积神经网络-实例及代码1(入门)—利用Tensorflow和mnist数据集训练单层前馈神经网络/感知机实现手写数字识别

 

2、实例及网络模型主要原理

(1)网络模型的输入

输入采用mnist数据集,图片在数据集中的数据大小为1*784,通过reshape转换为28*28大小的矩阵

(2)建立网络模型

网络的第一层:一个卷积层+一个Relu层+一个池化层,其中卷积层使用32个5*5大小、卷积步长为1、填充方式为SAME的卷积核;Relu层使用激活函数增强非线性表达;池化层采用2*2大小、步长为1、填充方式为SAME的矩阵进行最大化池化

网络的第二层:一个卷积层+一个Relu层+一个池化层,其中卷积层使用64个5*5大小、卷积步长为1、填充方式为SAME的卷积核;Relu层使用激活函数增强非线性表达;池化层采用2*2大小、步长为1、填充方式为SAME的矩阵进行最大化池化

网络的第三层:一个全连接层+一个Relu层,其中全连接层含有1024个神经元,将网络第二层的输出转换为[1,7*7*64]大小的矩阵后与其进行全连接操作;Relu层使用激活函数增强非线性表达

(3)训练模型参数

为了减少过拟合,在输出层之前加入dropout,用一个placeholder来代表一个神经元的输出在dropout中保持不变的概率,这样可以在训练过程中启用dropout,在测试过程中关闭dropout

TensorFlow的tf.nn.dropout操作会自动处理神经元输出值的scale,所以用dropout的时候可以不用考虑scale

损失函数使用目标类别和预测类别之间的交叉熵,通过损失函数最小化达到最小化误差的目的

训练优化器采用Adam梯度下降方法以最小化损失函数

(4)网络模型的输出

通过tf.nn.softmax获取在各个类别上概率值,通常最大概率值对应的类别就是预测到的类别

(5)评估模型
通过tf.argmax获取模型对于任一测试输入x预测到的类别标签值

利用tf.equal检测预测类别标签与真实类别标签是否一致,从而计算在测试数据集上的准确率

 

3、实例实现的主要步骤

(1)下载数据集,mnist数据集,可以直接去Lecun官网下载

      Lecun MNIST数据集网址:

                                 http://yann.lecun.com/exdb/mnist/

      mnist数据集介绍可以参考这篇文章:

                                  深度学习-卷积神经网络-实例及代码0.9—MNIST数据集介绍、下载及基本操作

(2)获取mnist数据集操作的python包,github上有

       Github项目地址:

                               tensorfow操作mnist数据集python包-Github

(3)编写代码

包括建立模型、训练模型和评估模型

利用MNIST训练集mnist.image训练网络模型

利用MNIST测试集mnist.test测试结果进行模型评估

      

4、实例代码分析                                 

本实例项目Github地址(如果对你有所帮助,欢迎关注点赞~):

                        https://github.com/firemonkeygit/DeepLearningTensorflowMNIST

参考MnistDLTrainBase.py文件,经过调试可用

注意导入操作mnist数据集的python包和配置正确的数据集路径

 

代码执行结果:

2020-09-13 16:00:39.406889: W tensorflow/core/framework/cpu_allocator_impl.cc:81] Allocation of 1003520000 exceeds 10% of system memory.
2020-09-13 16:00:40.364774: W tensorflow/core/framework/cpu_allocator_impl.cc:81] Allocation of 250880000 exceeds 10% of system memory.
2020-09-13 16:00:40.765965: W tensorflow/core/framework/cpu_allocator_impl.cc:81] Allocation of 501760000 exceeds 10% of system memory.
step 0,training accuracy 0.16279999911785126
2020-09-13 16:01:01.223743: W tensorflow/core/framework/cpu_allocator_impl.cc:81] Allocation of 1003520000 exceeds 10% of system memory.
2020-09-13 16:01:01.972312: W tensorflow/core/framework/cpu_allocator_impl.cc:81] Allocation of 250880000 exceeds 10% of system memory.
step 100,training accuracy 0.873199999332428
step 200,training accuracy 0.9153000116348267
step 300,training accuracy 0.9370999932289124
step 400,training accuracy 0.9469000101089478
step 500,training accuracy 0.9538000226020813
step 600,training accuracy 0.957099974155426
step 700,training accuracy 0.9643999934196472
step 800,training accuracy 0.964900016784668
step 900,training accuracy 0.9684000015258789
test accuracy 0.9686999917030334

主要源代码文件MnistDLTrainBase.py及说明如下:

import numpy as np
import tensorflow as tf
from TensorflowTest.mnist import input_data
#Tensorflow官方文档
#权重初始化
def weight_variable(shape):
    initial=tf.truncated_normal(shape,stddev=0.1)
    return tf.Variable(initial)
def bias_variable(shape):
    #使用的是ReLU神经元,因此比较好的做法是用一个较小的正数来初始化偏置项,以避免神经元节点输出恒为0的问题(dead neurons)
    initial=tf.constant(0.1,shape=shape)
    return tf.Variable(initial)

#卷积和池化
#卷积使用1步长(stride size),0边距(padding size)的模板,保证输出和输入是同一个大小,池化用简单传统的2x2大小的模板做max pooling。
def conv2d(x,w):
    return tf.nn.conv2d(x,w,strides=[1,1,1,1],padding='SAME')
def max_pool_2x2(x):
    return tf.nn.max_pool(x,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')

mnist=input_data.read_data_sets('../../MNIST_data',one_hot=True)
x = tf.placeholder("float", shape=[None, 784])
y_ = tf.placeholder("float", shape=[None, 10])

#第一层卷积
#第一层由一个卷积接一个max pooling完成。卷积在每个5x5的patch中算出32个特征。
#卷积的权重张量形状是[5, 5, 1, 32],前两个维度是patch的大小,接着是输入的通道数目,最后是输出的通道数目。 而对于每一个输出通道都有一个对应的偏置量。
w_conv1=weight_variable([5,5,1,32])
b_conv1=bias_variable([32])
#为了用这一层,把x变成一个4d向量,其第2、第3维对应图片的宽、高,最后一维代表图片的颜色通道数(因为是灰度图所以这里的通道数为1,如果是rgb彩色图,则为3)
x_image=tf.reshape(x,[-1,28,28,1])
h_conv1=tf.nn.relu(conv2d(x_image,w_conv1)+b_conv1)
h_pool1=max_pool_2x2(h_conv1)

#第二层卷积
w_conv2=weight_variable([5,5,32,64])
b_conv2=bias_variable([64])
h_conv2=tf.nn.relu(conv2d(h_pool1,w_conv2)+b_conv2)
h_pool2=max_pool_2x2(h_conv2)

#全连接层
#图片尺寸减小到7x7,我们加入一个有1024个神经元的全连接层,用于处理整个图片。我们把池化层输出的张量reshape成一些向量,乘上权重矩阵,加上偏置,然后对其使用ReLU
w_fc1=weight_variable([7*7*64,1024])
b_fc1=bias_variable([1024])
h_pool2_flat=tf.reshape(h_pool2,[-1,7*7*64])
h_fc1=tf.nn.relu(tf.matmul(h_pool2_flat,w_fc1)+b_fc1)

#Dropout
keep_prob=tf.placeholder("float")
h_fc1_drop=tf.nn.dropout(h_fc1,keep_prob)

#输出层
w_fc2=weight_variable([1024,10])
b_fc2=bias_variable([10])
y_conv=tf.nn.softmax(tf.matmul(h_fc1_drop,w_fc2)+b_fc2)

#训练和评估模型
cross_entropy=-tf.reduce_sum(y_*tf.log(y_conv))
train_step=tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
correct_prediction=tf.equal(tf.argmax(y_conv,1),tf.argmax(y_,1))
accuracy=tf.reduce_mean(tf.cast(correct_prediction,"float"))

with tf.Session() as sess:
    with tf.device("/cpu:0"):
        sess.run(tf.global_variables_initializer())
        for i in range(1000):
            batch=mnist.train.next_batch(100)
            sess.run(train_step,feed_dict={x:batch[0],y_:batch[1],keep_prob:0.5})
            if i%100==0:
                #train_accuracy=sess.run(accuracy,feed_dict={x:batch[0],y_:batch[1],keep_prob:1.0})
                train_accuracy = sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels, keep_prob: 1.0})
                print("step {0},training accuracy {1}".format(i,train_accuracy))

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值