MNIST 卷积神经网络。https://github.com/nlintz/TensorFlow-Tutorials/blob/master/05_convolutional_net.py 。
TensorFlow搭建卷积神经网络(CNN)模型,训练MNIST数据集。
构建模型。
定义输入数据,预处理数据。读取数据MNIST,得到训练集图片、标记矩阵,测试集图片标记矩阵。trX、trY、teX、teY 数据矩阵表现。trX、teX形状变为[-1,28,28,1],-1 不考虑输入图片数量,28x28 图片长、宽像素数,1 通道(channel)数量。MNIST 黑白图片,通道1。RGB彩色图像,通道3。
初始化权重,定义网络结构。卷积神经网络,3个卷积层、3个池化层、1个全连接层、1个输出层。
定义dropout占位符keep_conv,神经元保留比例。生成网络模型,得到预测值。
定义损失函数,tf.nn.softmax_cross_entropy_with_logits 比较预测值、真实值差异,做均值处理。
定义训练操作(train_op),RMSProp算法优化器tf.train.RMSPropOptimizer,学习率0.001,衰减值0.9,优化损失。
定义预测操作(predict_op)。
会话启动图,训练、评估。
#!/usr/bin/env python
import tensorflow as tf
import numpy as np
from tensorflow.examples.tutorials.mnist import input_data
batch_size = 128 # 训练批次大小
test_size = 256 # 评估批次大小
# 定义初始化权重函数
def init_weights(shape):
return tf.Variable(tf.random_normal(shape, stddev=0.01))
# 定义神经网络模型函数
# 入参:X 输入数据,w 每层权重,p_keep_conv、p_keep_hidden dropout保留神经元比例
def model(X, w, w2, w3, w4, w_o, p_keep_conv, p_keep_hidden):
# 第一组卷积层及池化层,dropout部分神经元
l1a = tf.nn.relu(tf.nn.conv2d(X, w, # l1a shape=(?, 28, 28, 32)
strides=[1, 1, 1, 1], padding='SAME'))
l1 = tf.nn.max_pool(l1a, ksize=[1, 2, 2, 1], # l1 shape=(?, 14, 14, 32)
strides=[1, 2, 2, 1], padding='SAME')
l1 = tf.nn.dropout(l1, p_keep_conv)
# 第二组卷积层及池化层,dropout部分神经元
l2a = tf.nn.relu(tf.nn.conv2d(l1, w2, # l2a shape=(?, 14, 14, 64)
strides=[1, 1, 1, 1], padding='SAME'))
l2 = tf.nn.max_pool(l2a, ksize=[1, 2, 2, 1], # l2 shape=(?, 7, 7, 64)
strides=[1, 2, 2, 1], padding='SAME')
l2 = tf.nn.dropout(l2, p_keep_conv)
# 第三组卷积层及池化层,dropout部分神经元
l3a = tf.nn.relu(tf.nn.conv2d(l2, w3, # l3a shape=(?, 7, 7, 128)
strides=[1, 1, 1, 1], padding='SAME'))
l3 = tf.nn.max_pool(l3a, ksize=[1, 2, 2, 1], # l3 shape=(?, 4, 4, 128)
strides=[1, 2, 2, 1], padding='SAME')
l3 = tf.reshape(l3, [-1, w4.get_shape().as_list()[0]]) # reshape to (?, 2048)
l3 = tf.nn.dropout(l3, p_keep_conv)
# 全连接层,dropout部分神经元
l4 = tf.nn.relu(tf.matmul(l3, w4))
l4 = tf.nn.dropout(l4, p_keep_hidden)
# 输出层
pyx = tf.matmul(l4, w_o)
return pyx # 返回预测值
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
trX, trY, teX, teY = mnist.train.images, mnist.train.labels, mnist.test.images, mnist.test.labels
# 数据预处理
trX = trX.reshape(-1, 28, 28, 1) # 28x28x1 input img
teX = teX.reshape(-1, 28, 28, 1) # 28x28x1 input img
X = tf.placeholder("float", [None, 28, 28, 1])
Y = tf.placeholder("float", [None, 10])
# 卷积核大小 3x3
# patch大小3x3,输入维度1,输出维度32
w = in