Tensorflow---基于TensorFlow实现手写数字的模型训练预测

Tensorflow—基于TensorFlow实现手写数字的模型训练预测

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

# 加几个随机数种子,让多次运行的时候,随机数列一致
np.random.seed(28)
tf.set_random_seed(28)

if __name__ == '__main__':
    with tf.Graph().as_default():
        # 一、执行图的构建
        unit_size1 = 32
        unit_size2 = 64
        with tf.variable_scope('network',
                               initializer=tf.random_normal_initializer(mean=0.0, stddev=0.01)):
            with tf.variable_scope("InputLayer"):
                # a. 定义占位符
                input_x = tf.placeholder(dtype=tf.float32, shape=[None, 784], name='image')
                input_y = tf.placeholder(dtype=tf.float32, shape=[None, 10], name='label')
				
				tf.summary.image(name='mnist',  # 给定可视化的字符串名称
                 				tensor=tf.reshape(input_x, shape=[-1, 28, 28, 1]),
                             # 给定可视化的tensor对象,要求形状必须为[batch_size, height, width, channels], 也就是[样本数目,一张图形的高度,一张图形的宽度,一张图形的通道数<灰度图形为1,RGB图形为3>]
                 				max_outputs=10  # 每次训练可视化batch_size个样本中的前多少个图形
                             )
            with tf.variable_scope("Hidden_Layer_1"):
                # 1. 定义参数
                w = tf.get_variable(name='w', shape=[784, unit_size1])
                b = tf.get_variable(name='b', shape=[unit_size1])
                # 2. 计算
                n1 = tf.matmul(input_x, w) + b
                # 3. 激活
                o1 = tf.nn.sigmoid(n1)

            with tf.variable_scope("Hidden_Layer_2"):
                # 1. 定义参数
                w = tf.get_variable(name='w', shape=[unit_size1, unit_size2])
                b = tf.get_variable(name='b', shape=[unit_size2])
                # 2. 计算
                n2 = tf.matmul(o1, w) + b
                # 3. 激活
                o2 = tf.nn.sigmoid(n2)

            with tf.variable_scope("Output_Layer"):
                # 1. 定义参数
                w = tf.get_variable(name='w', shape=[unit_size2, 10])
                b = tf.get_variable(name='b', shape=[10])
                # 2. 计算
                z = tf.matmul(o2, w) + b
                p = tf.nn.softmax(z)
                y_ = tf.argmax(p, axis=1)

        with tf.name_scope('loss'):
            # d. 损失函数构建(交叉熵损失函数)
            loss = tf.reduce_mean(-tf.log(tf.reduce_sum(input_y * p, axis=1)), name='loss')
            tf.summary.scalar('loss', loss)

        with tf.name_scope('train'):
            # e. 定义优化器(优化器的意思:求解让损失函数最小的模型参数<变量>的方式)
            # optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01)
            optimizer = tf.train.AdamOptimizer(learning_rate=0.01)
            # f. 定义一个训练操作对象
            train_op = optimizer.minimize(loss=loss)

        with tf.name_scope('accuracy'):
            # 将实际值转换为和预测值一样的形式
            label_ = tf.argmax(input_y, axis=1)
            # 比较预测值和实际值,并且将相等的位置设置为1,不相等的位置设置为0
            tmp = tf.cast(tf.equal(y_, label_), tf.float32)
            # 直接计算均值作为准确率
            accuracy = tf.reduce_mean(tmp)
            tf.summary.scalar('acc', accuracy)

        # 二、执行图的训练运行
        with tf.Session() as sess:
            # a. 创建一个持久化对象
            saver = tf.train.Saver()

            # a. 变量的初始化操作
            sess.run(tf.global_variables_initializer())
            # saver.restore(sess, './models/25/model/model.ckpt')

            # 获取一个日志输出对象
            writer = tf.summary.FileWriter(logdir='./models/01/graph', graph=sess.graph)
            # 获取所有的summary输出操作
            summary = tf.summary.merge_all()

            # b. 训练数据的产生/获取(基于numpy随机产生<可以先考虑一个固定的数据集>)
            mnist = input_data.read_data_sets(
                train_dir='../datas/mnist',  # 给定本地磁盘的数据存储路径
                one_hot=True,  # 给定返回的数据中是否对Y做哑编码
                validation_size=5000  # 给定验证数据集的大小
            )
            x_train, y_train = mnist.train.images, mnist.train.labels
            x_test, y_test = mnist.test.images, mnist.test.labels

            # c. 模型训练
            for step in range(10):
                # 1. 触发模型训练操作
                _, loss_, accuracy_, summary_ = sess.run([train_op, loss, accuracy, summary], feed_dict={
                    input_x: x_train,
                    input_y: y_train
                })
                print("第{}次训练后模型的损失函数为:{}, 准确率:{}".format(step, loss_, accuracy_))
                writer.add_summary(summary_, global_step=step)
                # 触发模型持久化
                save_path = './models/01/model/model.ckpt'
                dirpath = os.path.dirname(save_path)
                if not os.path.exists(dirpath):
                    os.makedirs(dirpath)
                saver.save(sess, save_path=save_path)

            # 1. 触发模型训练操作
            loss_, accuracy_ = sess.run([loss, accuracy], feed_dict={
                input_x: x_test,
                input_y: y_test
            })
            print("最终模型在测试数据上的损失函数:{}, 准确率:{}".format(loss_, accuracy_))

            # 关闭输出流
            writer.close()

注:
一、

'''
tensorflow执行的一般流程:
'''
with tf.Graph().as_default():
	# 零、 获取全局step变量对象
    global_step = tf.Variable(0, dtype=tf.int64)
    
    # 一、执行图的构建
    with tf.variable_scope('network'):
    	# a. 定义占位符
    	# b. 定义模型参数
    	# c. 模型预测的构建(获取预测值)
    	
    # 二、 损失函数构建
    with tf.name_scope('loss'):
    
    # 三、 计算准确率
    with tf.name_scope('accuracy'):
    
	#四、执行图的训练运行
	with tf.Session() as sess:

二、

tf.summary.image(name='mnist',  # 给定可视化的字符串名称
                 tensor=tf.reshape(input_x, shape=[-1, 28, 28, 1]),
                             # 给定可视化的tensor对象,要求形状必须为[batch_size, height, width, channels], 也就是[样本数目,一张图形的高度,一张图形的宽度,一张图形的通道数<灰度图形为1,RGB图形为3>]
                 max_outputs=10  # 每次训练可视化batch_size个样本中的前多少个图形
                             )
上一篇:使用torchsummary打印torch模型结构,包括每层名字以及形状


下一篇:InvalidArgumentError: Tensor must be 4-D with last dim 1, 3, or 4, not [shape]