深度学习代码案例-Mnist手写数字识别(全连接)

1、数据集介绍

在这里插入图片描述

2、特征值参考图片

在这里插入图片描述

3、目标值(one-hot编码)参考图片

在这里插入图片描述

4、源程序代码如下(注释已经尽可能详细了):

"""
   __author__="dazhi"
    2021/3/18-20:22
"""
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data


# Mnist手写数字识别
# 特征值--每个照片的形状是28*28的,由于是黑白的照片所以通道数是1
# 目标值--one-hot编码

def full_connection():
    tf.compat.v1.disable_eager_execution()
    # 1、----------------------------------------首先是准备数据
    mnist = input_data.read_data_sets("./mnist_data", one_hot=True)
    # shape中None意思是不知道有多少个样本。784的由来是28*28(我们上边提到的图片形状)
    x = tf.compat.v1.placeholder(dtype=tf.float32, shape=(None, 784))
    # shape中None意思是不知道有多少个样本。一共有10种可能性那么one-hot就是10
    y_true = tf.compat.v1.placeholder(dtype=tf.float32, shape=(None, 10))
    # 2、-----------------------------------------构建模型
    # 初始化权重
    # shape=(784,10)的由来是上边x和y_true满足的关系是这样的:矩阵(None,784)*矩阵(784,10)=矩阵(None,10),这是矩阵相乘的规则
    Weights = tf.Variable(initial_value=tf.compat.v1.random_normal(shape=(784, 10)))
    # 偏置的初始化
    bias = tf.Variable(initial_value=tf.compat.v1.random_normal(shape=[10]))
    # y_predict的计算公式x*weights+bias(乘权重加偏置)
    y_predict = tf.matmul(x, Weights) + bias
    # 3、-----------------------------------------构造损失函数
    # tf.nn.softmax_cross_entropy_with_logits求交叉熵的函数返回的是列表
    # 思想就是比较预测值和真实值,比较完之后通过mean求个平均
    error = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_true, logits=y_predict))
    # 4、-----------------------------------------优化损失
    # 采用的是梯度下降
    # learning_rate参数是学习率(0.01比较经典,记住不是越大越好)
    optimizer = tf.compat.v1.train.GradientDescentOptimizer(learning_rate=0.01).minimize(error)

    # Variable是定义变量用的。我们上边用到了。所以我们要先初始化变量
    init = tf.compat.v1.global_variables_initializer()

    # 开启会话
    with tf.compat.v1.Session() as sess:
        # 运行刚刚那个初始化变量(这样用变量就不会出错了)
        sess.run(init)
        # 将x和y_true先fit进来
        # 先拿到真实值
        image, label = mnist.train.next_batch(100)
        # .eval的作用和run一样
        print("训练之前的损失:%f " % sess.run(error,feed_dict={x:image,y_true:label}))
        #开始训练
        for i in range(100):
            #运行optimizer之后的返回值没用可以用‘_’接一下
            _,loss = sess.run([optimizer,error],feed_dict={x:image,y_true:label})
            print("第 %d 训练之后的损失:%f " % (i+1,loss))

    return None


if __name__ == '__main__':
    full_connection()

5、程序输出结果如下

我这里只训练了100次效果不是很明显。可以通过增加训练次数或者修改学习率来降低损失。
在这里插入图片描述

6、模型完善

增加准确率计算。

6-1、准确率计算:

比较输出的结果最大值所在位置和真实值的最大值所在位置
在这里插入图片描述

6-2、修改后的源程序代码如下:(在上面的程序基础上进行的添加)

"""
   __author__="dazhi"
    2021/3/18-20:22
"""
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data


# Mnist手写数字识别
# 特征值--每个照片的形状是28*28的,由于是黑白的照片所以通道数是1
# 目标值--one-hot编码

def full_connection():
    tf.compat.v1.disable_eager_execution()
    # 1、----------------------------------------首先是准备数据
    mnist = input_data.read_data_sets("./mnist_data", one_hot=True)
    # shape中None意思是不知道有多少个样本。784的由来是28*28(我们上边提到的图片形状)
    x = tf.compat.v1.placeholder(dtype=tf.float32, shape=(None, 784))
    # shape中None意思是不知道有多少个样本。一共有10种可能性那么one-hot就是10
    y_true = tf.compat.v1.placeholder(dtype=tf.float32, shape=(None, 10))
    # 2、-----------------------------------------构建模型
    # 初始化权重
    # shape=(784,10)的由来是上边x和y_true满足的关系是这样的:矩阵(None,784)*矩阵(784,10)=矩阵(None,10),这是矩阵相乘的规则
    Weights = tf.Variable(initial_value=tf.compat.v1.random_normal(shape=(784, 10)))
    # 偏置的初始化
    bias = tf.Variable(initial_value=tf.compat.v1.random_normal(shape=[10]))
    # y_predict的计算公式x*weights+bias(乘权重加偏置)
    y_predict = tf.matmul(x, Weights) + bias
    # 3、-----------------------------------------构造损失函数
    # tf.nn.softmax_cross_entropy_with_logits求交叉熵的函数返回的是列表
    # 思想就是比较预测值和真实值,比较完之后通过mean求个平均
    error = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_true, logits=y_predict))
    # 4、-----------------------------------------优化损失
    # 采用的是梯度下降
    # learning_rate参数是学习率(0.01比较经典,记住不是越大越好)
    optimizer = tf.compat.v1.train.GradientDescentOptimizer(learning_rate=0.01).minimize(error)
    #5、------------------------------------------准确率计算
    #y_true的形状是(None,10),tf.argmax的第二个参数是shape的下标,显示按哪个进行比较
    #比较输出结果的最大值所在的位置和真实值的最大值所在的位置
    equal_list = tf.equal(tf.argmax(y_true,1),tf.argmax(y_predict,1))
    #5-1、类型转换之后求平均
    accuracy = tf.reduce_mean(tf.cast(equal_list,tf.float32))

    # Variable是定义变量用的。我们上边用到了。所以我们要先初始化变量
    init = tf.compat.v1.global_variables_initializer()

    # 开启会话
    with tf.compat.v1.Session() as sess:
        # 运行刚刚那个初始化变量(这样用变量就不会出错了)
        sess.run(init)
        # 将x和y_true先fit进来
        # 先拿到真实值
        image, label = mnist.train.next_batch(100)
        # .eval的作用和run一样
        print("训练之前的损失:%f " % sess.run(error,feed_dict={x:image,y_true:label}))
        #开始训练
        for i in range(3000):
            #运行optimizer之后的返回值没用可以用‘_’接一下
            _,loss,accuracy_value = sess.run([optimizer,error,accuracy],feed_dict={x:image,y_true:label})
            print("第 %d 训练之后的损失:%f 准确率为: %f" % (i+1,loss,accuracy_value))

    return None


if __name__ == '__main__':
    full_connection()

6-3、程序运行结果如下(增加准确率)

在这里插入图片描述

7、用到的文件夹如下:

点我进行下载~~~~(mnist)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

喜欢地上爬的孩子

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值