在mnist数据集上用tensorflow搭建CNN模型
import tensorflow as tf
import numpy as np
from tensorflow.examples.tutorials.mnist import input_data
import warnings
warnings.filterwarnings("ignore")
mnist = input_data.read_data_sets('mnist_data', one_hot=True)
input_x = tf.placeholder(tf.float32, [None, 28*28])/255
output_y = tf.placeholder(tf.int32, [None, 10]) # 10个数字的标签
input_x_images = tf.reshape(input_x, [-1, 28, 28, 1])
test_x = mnist.test.images[:3000]
test_y = mnist.test.labels[:3000]
print(mnist.train.images.shape) # 可以查看数据大小
print(mnist.test.images.shape)
# 第一层卷积, 输出形状编程[-1, 28, 28, 32]
conv1 = tf.layers.conv2d(
inputs=input_x_images,
filters=32, # 32个过滤器
kernel_size=[5, 5], # 过滤器在二维的大小
strides=1, # 步长为1
padding='same', # same表示输出大小不变,因此需要在外围补0(两圈)
activation=tf.nn.relu # 激活函数
)
# 池化层(亚采样),主要是采取部分数据,步长为2,经过亚采样后变为[-1,14, 14, 32]
# pooling:max_pooling和average_pooling两种
pool1 = tf.layers.max_pooling2d(
inputs=conv1,
pool_size=[2, 2], # 亚采样,在2*2中取出一个最大值
strides=2 # 步长为2
)
# 第二层卷积, 输出大小为[-1,14, 14, 64]
conv2 = tf.layers.conv2d(
inputs=pool1,
filters=64, # 64个过滤器
kernel_size=[5, 5], # 过滤器在二维的大小
strides=1, # 步长为1
padding='same', # same表示输出大小不变,因此需要在外围补0(两圈)
activation=tf.nn.relu # 激活函数
)
# 第二层池化, 输出大小为[-1,7, 7, 64]
pool2 = tf.layers.max_pooling2d(
inputs=conv2,
pool_size=[2, 2], # 亚采样,在2*2中取出一个最大值
strides=2 # 步长为2
)
# 平坦化
flat = tf.reshape(pool2, [-1, 7*7*64]) # 把数据铺平,每张图片变成一个7*7*64大小的行向量
# 全连接层,1024个神经元
dense = tf.layers.dense(
inputs=flat,
units=1024, # 1024个神经元
activation="relu"
)
# dropout:丢弃部分数据,rate即为丢弃数据的百分比
dropout = tf.layers.dropout(
inputs=dense,
rate=0.5, # r即为丢弃数据的百分比
training=True
)
# 10个神经元的全连接层,这里不用激活函数来做非线性化了
logits = tf.layers.dense(
inputs=dropout,
units=10
)
# 计算误差(cross entropy, 再用softmax计算百分比)softmax是一种激活函数
loss = tf.losses.softmax_cross_entropy(
onehot_labels=output_y, # 真实标签
logits=logits # 神经网络的预估
)
# 用优化器来最小化误差
train_op = tf.train.AdamOptimizer(learning_rate=0.001).minimize(loss)
# 计算预测值和标签的正确率
accuracy = tf.metrics.accuracy(
labels=tf.argmax(output_y, axis=1), # axis=1表示按行最大值, axis=0表示按列最大值
predictions=tf.argmax(logits, axis=1)
)[1]
# 创建会话
sess = tf.Session()
# 初始化变量
init = tf.group(tf.global_variables_initializer(), tf.local_variables_initializer())
sess.run(init)
for i in range(20000):
batch = mnist.train.next_batch(50) # 从train训练集里取50个样本
train_loss, train_op_ = sess.run([loss, train_op], feed_dict={input_x: batch[0], output_y: batch[1]})
if i%100==0:
test_accuracy = sess.run(accuracy, {input_x:test_x, output_y:test_y})
print("Step=%d, Train loss=%.4f, Test accuracy=%.4f"%(i, train_loss, test_accuracy))
训练结果: