卷积神经网络完成mnist数据集的训练和测试

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”)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值