今天和大家一起来看下基于TensorFlow实现CNN的代码示例,源码参见Convolutional_netWork。使用MNIST数据集进行训练和预测,下面开始代码注解。
'''
这里从源码的角度详细说明使用TensorFlow如何简单的实现卷积神经网络
使用MNIST数据集进行卷积神经网络的实现
使用MNIST数据集
数据集参见:http://yann.lecun.com/exdb/mnist/)
源码地址:
https://github.com/aymericdamien/TensorFlow-Examples/blob/master/examples/3_NeuralNetworks/convolutional_network.py
'''
导入相关方法和模块
from __future__ import print_function
import tensorflow as tf
# 导入 MNIST 数据
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("/tmp/data/", one_hot=True)
基本参数设置
# 参数设置
#学习速率(也有称为步长的)
learning_rate = 0.001
#迭代的次数
training_iters = 200000
#每个批次的数据大小(这里表示每个批次使用128张图片)
batch_size = 128
#每10次进行一次结果输出
display_step = 10
#网络相关参数
#输入数据,每个待处理图片是28*28的矩阵,可以理解为将其拉平则变为一个长度为784的数组
n_input = 784
#分类数量,最终是解决分类问题,这里分为10类,卷积神经网络也只是替代传统机器学习中特征提取的这个过程
n_classes = 10
#随机失活概率,也有叫留存率的,即在dropout层,以这个概率进行随机失活,进而减少过拟合
dropout = 0.75
基本输入的占位
# 图的输入参数定义,TensorFlow中会将各个Option编排成一个DAG(有向无环图)
# 这里定义输入,可以理解为采用占位符进行站位,待实际运行时进行具体填充,这里None表示运行时指定
# [参见]tf.placeholder使用
x = tf.placeholder(tf.float32, [None, n_input])
y = tf.placeholder(tf.float32, [None, n_classes])
#失活概率
keep_prob = tf.placeholder(tf.float32)
定义卷积神经网络
# 该函数实现卷基层的定义
# 在卷积神经网络中,往往存在多层卷基层,这里将卷积的定义当初抽出来
# 实现很简单,即采用卷积核(或者理解成滤波器)W对待处理数据x进行卷积计算(理解成在图像上平移过滤,当然也会处理深度的问题)
# 在每个窗口都可以理解成进行窗口内的WX+b这样的计算(这里的X是窗口内的数据,W是卷积核)
def conv2d(x, W, b, strides=1):
#进行卷积计算,padding = 'SAME'表示处理后输出图像大小不变,如果valid则是变动的
#一般在多层卷积中,往往会控制图像大小不变,否则处理起来比较困难,每层处理都要考虑图像大小
#[参见]卷积计算
x = tf.nn.conv2d(x, W, strides=[1, strides, strides, 1], padding='SAME')
x = tf.nn.bias_add(x, b)
#对结果进行非线性激活
#[参见]激活函数
return tf.nn.relu(x)
定义池化操作
# 进行池化操作,这里进行最大池化
# 池化可以达到降低数据量、利用更过的局部信息的目的
# 这里k默认为2,移动的步长是2,那么图像处理后相当于减小一半
# [参见]池化操作
def maxpool2d(x, k=2):
return tf.nn.max_pool(x, ksize=[1, k, k, 1], strides=[1, k, k, 1],
padding='SAME')