coding=utf-8
“”"
author:lei
function:
“”"
import numpy as np
import tensorflow as tf
下载并载入Mnist 手写数字库(55000 * 28 * 28)
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets(‘mnist_data’, one_hot=True)
one_hot 独热码(encoding)形式
0-9的十位数字 0:1000000000 1:0100000000
None 表示张量(Tensor)的第一个维度可以是任意维度
input_x = tf.placeholder(tf.float32, [None, 28*28]) / 255
十个数字的预测
output_y = tf.placeholder(tf.int32, [None, 10])
改变形状之后的输入
input_x_images = tf.reshape(input_x, [-1, 28, 28, 1])
从Test(测试)数据集选取3000个手写图片的图片和对应标签
test_x = mnist.test.images[:3000]
test_y = mnist.test.labels[:3000]
构建卷积神经网络
构建第一层卷积 形状28281 输出为 282832,有32个过滤器 输出的深度为32,每个kernel_size过滤器大小5*5,步长为1,same表示输出的大小不变,因此需要在外围补两圈,激活函数为relu。
conv1 = tf.layers.conv2d(inputs=input_x_images, filters=32, kernel_size=[5, 5], strides=1, padding=“SAME”, activation=tf.nn.relu)
第一层池化(亚采样)[28, 28, 32] --> [14, 14, 32] 过滤器的大小[2, 2]。步长是2。
pool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[2, 2], strides=2)
第二层卷积 [14, 14, 32] --> [14, 14, 64]
conv2 = tf.layers.conv2d(inputs=pool1, filters=64, kernel_size=[5, 5], strides=1, padding=“SAME”, activation=tf.nn.relu)
第二层采样 [14, 14, 64] --> [7, 7, 64]
pool2 = tf.layers.max_pooling2d(inputs=conv2, pool_size=[2, 2], strides=2)
平坦化(flatten) 形状[-1, 1024]
flat = tf.reshape(pool2, [-1, 7764])
1024个神经元的全连接层
dense = tf.layers.dense(inputs=flat, units=1024, activation=tf.nn.relu)
dropout:丢弃50% rate:0.5
dropout = tf.layers.dropout(inputs=dense, rate=0.5)
10个神经元的全连接层,这里不用激活函数来做非线性化了
输出 [-1, 10]
logits = tf.layers.dense(inputs=dropout, units=10)
计算误差(计算cross entropy 交叉熵,再用softmax计算出百分比概率)
loss = tf.losses.softmax_cross_entropy(onehot_labels=output_y, logits=logits)
用Adam优化器,学习率0.001
train_op = tf.train.AdamOptimizer(learning_rate=0.001).minimize(loss)
精度,计算预测值和实际标签的匹配程度
返回(accuracy,update_op)会创建两个局部变量
accuracy = tf.metrics.accuracy(labels=tf.argmax(output_y, axis=1), 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(2000):
# 从 Train 训练数据集中取下一组 50个样本
batch = mnist.train.next_batch(50)
train_loss, train_op_ = sess.run([loss, train_op], {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:{}, train_loss:{}, [test_accuracy={}]”.format(i, train_loss, test_accuracy))
测试:打印20个预测值和真实值的比对
test_output = sess.run(logits, {input_x: test_x[:20]})
inferenced_y = np.argmax(test_output, 1)
推测的数字
print(inferenced_y, “Inferenced numbers”)
print(np.argmax(test_y[:20], 1), “Real numbers”)