Mnist手写数字识别进阶:多层神经网络应用(续)

在上一节中,构建了多层神经网络来对Mnist手写数字进行识别,但是我们也只设置了一个隐藏层,为了是我们的模型准确可以达到更高,其实我们可以多写几个隐藏层,那么这里我们就再加入一个隐藏层。

目录

    • 构建模型
    • 附:完整代码

主要做出的修改就是构建神经网络的部分,多加入一层隐藏层。

构建模型

# 构建隐藏层
H1_NN = 256   # 第1隐藏层神经元数量
H2_NN = 64    # 第2隐藏层神经元数量

# 输入层 - 第1隐藏层参数和偏置项
w1 = tf.Variable(tf.truncated_normal([784, H1_NN], stddev=0.1))
b1 = tf.Variable(tf.zeros([H1_NN]))

# 第1隐藏层 - 第2隐藏层参数和偏执项
w2 = tf.Variable(tf.truncated_normal([H1_NN, H2_NN], stddev=0.1))
b2 = tf.Variable(tf.zeros([H2_NN]))

# 第2隐藏层 - 输出层参数和偏置项
w3 = tf.Variable(tf.truncated_normal([H2_NN, 10], stddev=0.1))
b3 = tf.Variable(tf.zeros([10]))

# 计算第1隐藏层结果
y1 = tf.nn.relu(tf.matmul(x, w1) + b1)

# 计算第2隐藏层结果
y2 = tf.nn.relu(tf.matmul(y1, w2) + b2)

# 计算输出结果
forward = tf.matmul(y2, w3) + b3
pred = tf.nn.softmax(forward)

训练结果:
Mnist手写数字识别进阶:多层神经网络应用(续)_第1张图片

附:完整代码

#-*- coding = utf-8 -*-
#@Time : 2021-03-13 21:11
#@Author : 穆永恒
#@File : Mnist_2.py
#@Software: PyCharm

import tensorflow as tf
import tensorflow.examples.tutorials.mnist.input_data as input_data
import matplotlib.pyplot as plt
import numpy as np


# 读取数据文件
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)

# 构建输入层
# 定义标签数据占位符
x = tf.placeholder(tf.float32, [None, 784], name="X")
y = tf.placeholder(tf.float32, [None, 10], name="Y")


# 构建隐藏层
H1_NN = 256   # 第1隐藏层神经元数量
H2_NN = 64    # 第2隐藏层神经元数量

# 输入层 - 第1隐藏层参数和偏置项
w1 = tf.Variable(tf.truncated_normal([784, H1_NN], stddev=0.1))
b1 = tf.Variable(tf.zeros([H1_NN]))

# 第1隐藏层 - 第2隐藏层参数和偏执项
w2 = tf.Variable(tf.truncated_normal([H1_NN, H2_NN], stddev=0.1))
b2 = tf.Variable(tf.zeros([H2_NN]))

# 第2隐藏层 - 输出层参数和偏置项
w3 = tf.Variable(tf.truncated_normal([H2_NN, 10], stddev=0.1))
b3 = tf.Variable(tf.zeros([10]))

# 计算第1隐藏层结果
y1 = tf.nn.relu(tf.matmul(x, w1) + b1)

# 计算第2隐藏层结果
y2 = tf.nn.relu(tf.matmul(y1, w2) + b2)

# 计算输出结果
forward = tf.matmul(y2, w3) + b3
pred = tf.nn.softmax(forward)


# 定义训练参数
train_epochs = 40  # 训练的轮数
batch_size = 50  # 单次训练样本数
total_batch = int(mnist.train.num_examples/batch_size)
display_step = 1  # 显示粒度
learning_rate = 0.01  # 学习率

# 定义损失函数
# loss_function = tf.reduce_mean(-tf.reduce_sum(y*tf.log(pred), reduction_indices=1))
loss_function = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=forward, labels=y))  # 结合Softmax的交叉熵损失函数定义方法

# 定义优化器
optimizer = tf.train.AdamOptimizer(learning_rate).minimize(loss_function)


# 定义准确率
correct_prediction = tf.equal(tf.argmax(pred, 1), tf.argmax(y, 1))
# 准确率,将布尔值转化为浮点数,并计算平均值
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))


# 模型训练
# 记录训练开始的时间
from time import time
startTime = time()

sess = tf.Session()
sess.run(tf.global_variables_initializer())

for epoch in range(train_epochs):
    for batch in range(total_batch):
        xs, ys = mnist.train.next_batch(batch_size)  # 读取批次数据
        sess.run(optimizer, feed_dict={x: xs, y: ys})   # 执行批次训练

    # total_batch 个批次训练完后,使用验证数据计算准确率
    loss, acc = sess.run([loss_function, accuracy], feed_dict={x: mnist.validation.images, y: mnist.validation.labels})
    # 打印训练过程中的详细信息
    if (epoch + 1) % display_step == 0:
        print("训练轮次:", epoch + 1, "损失值:", format(loss), "准确率:", format(acc))


# 显示运行总时间
duration = time() - startTime
print("本次训练所花的总时间为:", duration)



# 应用模型
prediction_result = sess.run(tf.argmax(pred, 1), feed_dict={x: mnist.test.images})
print(prediction_result[0:10])

# 找出预测错误的
compare_lists = prediction_result == np.argmax(mnist.test.labels, 1)
print(compare_lists)

err_lists = [i for i in range(len(compare_lists)) if compare_lists[i] == False]
print(err_lists, len(err_lists))

你可能感兴趣的:(机器学习与深度学习,神经网络,tensorflow,深度学习,python,人工智能)