深度学习代码案例-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()