0.MNIST数据集介绍:
MNIST数据集是由10000张28*28*1手写数字图片所构成的数据集,MNIST 数据集来自美国国家标准与技术研究所, National Institute of Standards and Technology (NIST). 训练集 (trainingset) 由来自 250 个不同人手写的数字构成, 其中 50% 是高中学生, 50% 来自人口普查局 (the Census Bureau) 的工作人员. 测试集(test set) 也是同样比例的手写数字数据.
下面是部分数据截图:
1.MNIST数据集目录结构:
Train-images* 是训练数据
Train-labels* 是训练数据的标签
T10k-image* 是测试图片
T10k-labels* 是测试图片的正确结果标签
2.本次训练采用的卷积神经网络结构:
LeNet卷积网络结构:
本次试验训练模型使用Tensorboard可视化:
本次实验采用了类似于LeNet模型的卷积结构:
神经网络层次: |
层次类别: |
Size |
第一层 |
MNIST数据层 |
28*28*1 |
第二层 |
Conv1(第一卷积层) |
32*5*5 |
第三层 |
池化层1 |
Size:2*2, stride:2,2 |
第四层 |
Conv2(第二卷积层) |
64*5*5 |
第五层 |
池化层2 |
Size:2*2 ,strie:2,2 |
第六层 |
全连接层1 |
Size:1024 |
第七层 |
第一激活层 |
Function: Relu |
第八层 |
全连接层2 |
Size: 10 |
第九层 |
第二激活层 |
Function:Softmax |
3.训练环境:
1.cuda 9.0 运算环境
2.cudnn 7.05 运算环境
3.GTX 960 Nvidia显卡,显存4G
4.Linux ubuntu 64位操作系统
5.操作系统内存 8G
6.Tensorflow-gpu 框架
7.Tensorboard 训练过程可视化
4.计算过程简述
卷积层:
卷积输入层数据为28*28的二位矩阵,第一卷积层节点个数设置为32个(即:神经元个数为32个),卷积方式采用填充0的方式,使得卷积后的数据大小保持28*28。池化层使用最大池化(max-pooling)方式。第一次卷积过后,数据量变为:28*28*32,对数据进行第一次max-pooling,数据维度变为:14*14*32,。第二卷基层节点个数设置为64个,卷积过后(同样采取填充0的方式使得卷积后图像的height, 和 width不变)数据维度为:14*14*64,进行max-pooling:7*7*64.
全连接层:
卷积层最后输出的数据维度为:7*7*64,在第一个全连接层设置1024个神经元节点,那么全连接输入层与全连接第一层的weights_1维度为:(7*7*64) ×(1024), bias_1 维度为 1*1024。Fc_1层采用Relu激活函数。
第二层全连接层神经元个数设置为10个,因为我们最终所要预测的结果集中的标签种类只有10类。fc_2层:weights_2:1024*10, bias: 1*10。激活函数采用Softmax函数,输出结果为输入数据所属每一类的概率。
5.代码实现
# -*- coding: utf-8 -*- """ python文件说明:卷积神经网络的程序 """ import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data mnist = input_data.read_data_sets('MNIST_data', one_hot=True) batch_size = 100 n_batch = mnist.train.num_examples // batch_size
导入tensorflow框架,mnist数据集,one_hot作用:将训练数据结果标签向量化,eg: 9 : 0000000001; 2:0010000000
Batch_size:每一批次数据量的大小(数据是分批次训练)
#初始化权值 def weight_variable(shape, name): initial = tf.truncated_normal(shape, stddev=0.1) return tf.Variable(initial, name=name) #初始化偏执值 def bias_variable(shape, name): initial = tf.constant(0.1, shape=shape) return tf.Variable(initial, name=name)
这里的两个函数分别初始化权值,和偏执值shape是初始化权值w的形状(维度数)(和bias的维度数)
#卷基层 def conv2d(x, w): return tf.nn.conv2d(x, w, strides=[1,1,1,1