Tensorflow实现简单的手写数字神经网络模型

1.全连接层直接实现手写数字神经网络

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data

#对于使用FLAGS,则在终端上运行的命令python mnistClassify.py --is_train=0
FLAGS = tf.app.flags.FLAGS
tf.app.flags.DEFINE_integer("is_train",1,"指定程序是否为训练")

def full_connected():
    #加载MNIST数据
    mnist = input_data.read_data_sets("./MNIST/", one_hot=True)

    #1.建立数据占位符 x[None,784]  y[None,10]
    with tf.variable_scope("data"):
        x = tf.placeholder(tf.float32,[None,784])
        y_true = tf.placeholder(tf.int32,[None,10])

    #2.建立一个全连接层的神经网络模型
    with tf.variable_scope("model"):
        #随机初始化权重和偏置
        weight = tf.Variable(tf.random_normal([784,10],mean=0.0,stddev=1.0),name="w")
        bias = tf.Variable(tf.constant(0.0,shape=[10]))
        y_predict = tf.matmul(x,weight) + bias

    #3.Softmax交叉熵损失函数, 求出所有样本的损失,然后求平均值
    with tf.variable_scope("loss"):
        #求平均交叉损失函数
        loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_true,logits=y_predict))

    #4.梯度下降求出损失函数
    with tf.variable_scope("optimizer"):
        #学习率
        leaning_rate = 0.1
        train_op = tf.train.GradientDescentOptimizer(leaning_rate).minimize(loss)

    #5.计算准确率
    with tf.variable_scope("acc"):
        equal_list = tf.equal(tf.argmax(y_true,1),tf.argmax(y_predict,1))
        # equal_list None个样本    [1 0 0 1 0 1 . . . . ]
        accuracy = tf.reduce_mean(tf.cast(equal_list,tf.float32))

    #收集变量 单个数字值收集
    tf.summary.scalar("losses",loss)
    tf.summary.scalar("acc",accuracy)
    #高纬度变量收集
    tf.summary.histogram("weight",weight)
    tf.summary.histogram("bias",bias)

    #定义初始化变量op
    init_op = tf.global_variables_initializer()

    #创建一个Serve
    serve = tf.train.Saver()

    #合并Summary
    meger = tf.summary.merge_all()

    #开启会话训练
    with tf.Session() as sess:
        sess.run(init_op)

        #建立事件events文件,然后写入
        filewrites = tf.summary.FileWriter("./MNIST/Events/",graph=sess.graph)

        if FLAGS.is_train == 1:
            # 迭代步数去训练,更新参数去预测
            for i in range(2000):
                # 取出训练集的特征值和目标值
                train_x, train_y = mnist.train.next_batch(50)

                sess.run(train_op, feed_dict={x: train_x, y_true: train_y})
                # 写入每步训练的值
                summary = sess.run(meger, feed_dict={x: train_x, y_true: train_y})
                filewrites.add_summary(summary, i)
                print("训练第%d步,准确率为:%f" % (i, sess.run(accuracy, feed_dict={x: train_x, y_true: train_y})))
            # 保存模型
            serve.save(sess, "./MNIST/model/fc_model")
        else:
            #加载模型
            serve.restore(sess,"./MNIST/model/fc_model")
            #如果是0,做出预测
            for i in range(100):
                #每次预测一张图片
                x_test, y_test = mnist.test.next_batch(1)
                print("第%d张图片,手写数字目标是:%d, 预测的图片结果是:%d"%(
                    i,
                    tf.argmax(y_test,1).eval(),
                    tf.argmax(sess.run(y_predict,feed_dict={x: x_test, y_true: y_test}),1).eval()
                ))

def prdect():
    # 加载MNIST数据
    mnist = input_data.read_data_sets("./MNIST/", one_hot=True)
    # 1.建立数据占位符 x[None,784]  y[None,10]
    with tf.variable_scope("data"):
        x = tf.placeholder(tf.float32, [None, 784])
        y_true = tf.placeholder(tf.int32, [None, 10])

    # 2.建立一个全连接层的神经网络模型
    with tf.variable_scope("model"):
        # 随机初始化权重和偏置
        weight = tf.Variable(tf.random_normal([784, 10], mean=0.0, stddev=1.0), name="w")
        bias = tf.Variable(tf.constant(0.0, shape=[10]))
        y_predict = tf.matmul(x, weight) + bias
    # 创建一个Serve
    serve = tf.train.Saver()
    with tf.Session() as sess:
        # 加载模型
        serve.restore(sess, "./MNIST/model/fc_model")
        # 如果是0,做出预测
        for i in range(100):
            # 每次预测一张图片
            x_test, y_test = mnist.test.next_batch(1)
            print("第%d张图片,手写数字目标是:%d, 预测的图片结果是:%d" % (
                i,
                tf.argmax(y_test, 1).eval(),
                tf.argmax(sess.run(y_predict, feed_dict={x: x_test, y_true: y_test}), 1).eval()
            ))

if __name__ == "__main__":
    full_connected()
    prdect()
  1. 卷积神经网络实现手写数字神经网络
def weight_variable(shape):
    """
    定义一个初始化的权重
    :param shape:
    :return:
    """
    weight = tf.Variable(tf.random_normal(shape=shape, mean=0.0, stddev=1.0), "w")
    return weight

def bias_variable(shape):
    """
    定义一个初始化的偏置
    :param shape:
    :return:
    """
    b = tf.Variable(tf.constant(0.0,shape=shape))
    return b

def model():
    """
    自定义卷积模型
    :return:
    """
    # 1.建立数据占位符 x[None,784]  y[None,10]
    with tf.variable_scope("data"):
        x = tf.placeholder(tf.float32, [None, 784])
        y_true = tf.placeholder(tf.int32, [None, 10])

    #2.一层卷积 卷积,激活,池化
    with tf.variable_scope("conv1"):
        #随机初始化偏置和权重
        weight_1 = weight_variable([5, 5, 1, 32])
        bias_1 = bias_variable([32])

        #对输入x进行形状的改变  [None, 28, 28, 1]
        x_reshape = tf.reshape(x, [-1, 28, 28, 1])
        #卷积
        conv1 = tf.nn.conv2d(x_reshape,weight_1,strides=1, padding="SAME") + bias_1
        #激活函数
        x_relu1 = tf.nn.relu(conv1)

        #池化 2*2 , strides2 [None, 28, 28, 2] -----> [None, 14, 14, 32]
        x_pool1 = tf.nn.max_pool(x_relu1,ksize=[1,2,2,1],strides=[1,2,2,1],padding="SAME")

    #二层卷积:5*5*32 64个filter , strides=1
    with tf.variable_scope("conv2"):
        # 随机初始化偏置和权重
        weight_2 = weight_variable([5, 5, 32, 64])
        bias_2 = bias_variable([64])

        #卷积,激活,池化
        #[None, 14, 14, 32] ----> [None, 14, 14, 64]
        # 卷积
        conv2 = tf.nn.conv2d(x_pool1, weight_2, strides=1, padding="SAME") + bias_2
        # 激活函数
        x_relu2 = tf.nn.relu(conv2)

        # 池化 2*2 , strides2 [None, 14, 14, 64] -----> [None, 7, 7, 64]
        x_pool2 = tf.nn.max_pool(x_relu2, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding="SAME")

    #全连接层   [None, 7, 7, 64] --->  [None, 7, 7, 64]*[7*7*64,10] + [10] = [None, 10]
    with tf.variable_scope("fc"):
        # 随机初始化偏置和权重
        weight_fc = weight_variable([7*7*64, 10])
        bias_fc = bias_variable([10])

        #修改形状  [None, 7, 7, 64] ----> [None,7*7*64]
        x_fc_reshpe = tf.reshape(x_pool2,[-1,7*7*64])

        #进行矩阵运算出每个样本的10个结果
        y_predict = tf.matmul(x_fc_reshpe,weight_fc) + bias_fc

    return x, y_true, y_predict

def conv_fc():
    """
    卷积神经网络训练手写数字
    :return:
    """
    # 加载MNIST数据
    mnist = input_data.read_data_sets("./MNIST/", one_hot=True)

    #定义模型,得出输出
    x, y_true, y_predict = model()

    #进行交叉熵损失计算
    # 3.Softmax交叉熵损失函数, 求出所有样本的损失,然后求平均值
    with tf.variable_scope("loss"):
        # 求平均交叉损失函数
        loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_true, logits=y_predict))

    # 4.梯度下降求出损失函数
    with tf.variable_scope("optimizer"):
        # 学习率
        leaning_rate = 0.001
        train_op = tf.train.GradientDescentOptimizer(leaning_rate).minimize(loss)

    # 5.计算准确率
    with tf.variable_scope("acc"):
        equal_list = tf.equal(tf.argmax(y_true, 1), tf.argmax(y_predict, 1))
        # equal_list None个样本    [1 0 0 1 0 1 . . . . ]
        accuracy = tf.reduce_mean(tf.cast(equal_list, tf.float32))

    #初始化变量
    init_op = tf.global_variables_initializer()

    #开启会话
    with tf.Session() as sess:
        sess.run(init_op)

        for i in range(1000):
            # 取出训练集的特征值和目标值
            train_x, train_y = mnist.train.next_batch(50)

            sess.run(train_op, feed_dict={x: train_x, y_true: train_y})
            print("训练第%d步,准确率为:%f" % (i, sess.run(accuracy, feed_dict={x: train_x, y_true: train_y})))


    return None
if __name__ == "__main__":
    # full_connected()
    # prdect()
    conv_fc()
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

九霄王

我们一起为这个世界努力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值