首页 > 其他分享 >tensorflow实现mnist手写数字识别

tensorflow实现mnist手写数字识别

时间:2023-05-11 11:55:25浏览次数:47  
标签:loss plt test images train tf tensorflow 手写 mnist

1. softmax函数

  在数学,尤其是概率论和相关领域中,归一化指数函数,或称Softmax函数,是逻辑函数的一种推广。它能将一个含任意实数的K维向量z“压缩”到另一个K维实向量σ(z)中,使得每一个元素的范围都在(0,1)之间,并且所有元素的和为1。该函数多用于多分类问题中。在多项逻辑回归和线性判别分析中,ak属于yk类的概率为:

  很显然,ak属于每个类别的概率和为1,属于yk的概率在0~1之间。

  Softmax 回归模型是解决多类回归问题的算法,是当前深度学习研究中广泛使用在深度网络有监督学习部分的分类器,经常与交叉熵损失函数联合使用。

2. softmax溢出问题

  当a足够大(比如100)或者足够小时(比如-100),导致计算机计算e^a溢出(上溢或下溢)

  根据上述softmax公式进行推导:

  即softmax(x)=softmax(x+a),这个结论被称为softmax的冗余性。

  我们令 x=x+a,其中a=−max(x),则:

  (x+a)的最大值等于0,避免了上溢的问题;

  同时,因为一定有x+a=0, 所以分母中的各个加数至少有一个为1,也就不可能趋于0,由此避免下溢的问题。

3. 交叉熵损失函数

  交叉熵可在神经网络(机器学习)中作为损失函数,p表示真实标记的分布,q则为训练后的模型的预测标记分布,交叉熵损失函数可以衡量p与q的相似性。交叉熵作为损失函数还有一个好处是使用sigmoid函数在梯度下降时能避免均方误差损失函数学习速率降低的问题,因为学习速率可以被输出的误差所控制。

4. tensorflow实现mnist数字分类

  使用tensorflow2中的高阶API keras实现卷积神经网络对mnist手写数字分类

import os
os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
os.environ["CUDA_VISIBLE_DEVICES"] = "-1"
import tensorflow as tf
from tensorflow.keras import  layers,models
import  matplotlib.pyplot as plt
import numpy as np

#读取数据
data=np.load('mnist.npz')
data.files
train_images,train_labels,test_images,test_labels=data['x_train'],data['y_train'],data['x_test'],data['y_test']
# train_images=train_images.reshape(32,28,28,1)#分别为batch_size, height, width, channel
# test_images=test_images.reshape(32,28,28,1)
train_images=np.array(train_images)
train_images=np.reshape(train_images,(-1,28,28,1))#分别为batch_size, height, width, channel
print("train_images",train_images[0])
test_images=np.array(test_images)
test_images=np.reshape(test_images,(-1,28,28,1))
print("test_images",test_images[0])
model=models.Sequential()
model.add(layers.Conv2D(28,(3,3),activation='relu',input_shape=(28,28,1)))#
model.add(layers.MaxPool2D((2,2),input_shape=(26,26,28))) # 添加池化层
model.add(layers.Conv2D(10,(4,4),activation='relu',input_shape=(13,13,28)))
model.add(layers.MaxPool2D((2,2),input_shape=(3,3,10))) # 添加池化层
model.add(layers.Flatten(input_shape=(-1,2,2,10)))#将卷积得到的数据展平后与全连接层连接
model.add(layers.Dense(20,activation='relu'))
model.add(layers.Dense(10,activation='softmax'))
model.summary( )
#编译模型
model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])
#训练
his=model.fit(train_images,train_labels,verbose=1,epochs=10,validation_data=(test_images,test_labels))
#保存模型
model.save('conv_minist.h5')

#画图 性能评估
acc = his.history['accuracy']
val_acc = his.history['val_accuracy']
loss =his.history['loss']
val_loss = his.history['val_loss']

plt.figure(figsize=(15, 5))
plt.subplot(1, 2, 1)
plt.plot(acc, label='Training Accuracy')
plt.plot(val_acc, label='Validation Accuracy')
plt.title('Training and Validation Accuracy')
plt.legend()
#plt.grid()
plt.subplot(1, 2, 2)
plt.plot(loss, label='Training Loss')
plt.plot(val_loss, label='Validation Loss')
plt.title('Training and Validation Loss')
plt.legend()
#plt.grid()
plt.show()

  tensorflow实现深度神经网络对mnist手写数字分类

import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
import numpy as np
import matplotlib.pyplot as plt
import pylab
from tensorflow.examples.tutorials.mnist import input_data   #报错时,请参考本文最后参考资料的最后两个链接
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
print("mnist:")
print(mnist)
# tf.reset_default_graph()
# 定义占位符
X = tf.placeholder("float", [None, 784])
Y = tf.placeholder("float", [None, 10])
# 定义变量,reduction_indices=1)
W = tf.Variable(tf.random_normal([784, 10]))
b = tf.Variable(tf.random_normal([10]))
pred = tf.nn.softmax(tf.matmul(X, W) + b)  # softmax分类,X是一个二维张量,也就是一个二维矩阵
# 损失函数
cost = -tf.reduce_sum(Y * tf.log(pred))
# 超参数设置
learn_rate = 0.01  # 学习率
round = 1000  # 迭代次数
# 设置字典用于存储迭代轮数对应的损失值,方便画图
epoch_J = {"epoch": [], "loss": []}
# 梯度下降
Optimizer = tf.train.GradientDescentOptimizer(learn_rate).minimize(cost)
# 初始化函数
init = tf.initialize_all_variables()
# 启动
with tf.Session() as sess:
    sess.run(init)
    for i in range(round):
        batch_x, batch_y = mnist.train.next_batch(100)  # 批次大小为100
        sess.run(Optimizer, feed_dict={X: batch_x, Y: batch_y})  # 梯度下降
        loss = sess.run(cost, feed_dict={X: batch_x, Y: batch_y})  # 取这次迭代的代价函数值
        epoch_J["epoch"].append(i + 1)
        epoch_J["loss"].append(loss)  # 把本次迭代的代价函数值放入字典中
        print("迭代次数:", i + 1, " loss值:", epoch_J["loss"][i], " 当前W:", sess.run(W), "当前b:",
              sess.run(b))  # 输出每次迭代的损失值和参数值
    # 画代价函数图
    plt.plot(epoch_J["epoch"], epoch_J["loss"],  label="epoch_loss")
    plt.legend()
    plt.show()

    # 评估模型
    correct_prediction = tf.equal(tf.argmax(Y, 1), tf.argmax(pred, 1))#对比这两个矩阵或者向量的相等的元素,如果是相等的那就返回True,反正返回False
    print(tf.argmax(Y, 1))
    print("correct_prediction",correct_prediction)
    accuary = tf.reduce_mean(tf.cast(correct_prediction, "float"))## 将bool值转为float类型(即0或1)再求均值即为准确率
    print(tf.cast(correct_prediction,"float"))
    print(sess.run(accuary, feed_dict={X: mnist.test.images, Y: mnist.test.labels}))

  总结:关于mnist数据集可以去我的主页K近邻算法(KNN)查看,有解释与离线数据。本文存在不足,未解释softmax如何应用于手写数字分类,未对tensorflow代码详细解释,也未对卷进神经网络作详细说明,后期补上。

  若存在错误或不足之处,欢迎指正与评论!

  代码与数据百度网盘链接:https://pan.baidu.com/s/1Z-vJJoY1AGnDZat5PpDzWg?pwd=8gfx

参考资料:

https://blog.csdn.net/whdeast/article/details/104962702

https://www.cnblogs.com/wangguchangqing/p/12068084.html

https://baike.baidu.com/item/%E5%BD%92%E4%B8%80%E5%8C%96%E6%8C%87%E6%95%B0%E5%87%BD%E6%95%B0/22660782?fromtitle=Softmax%E5%87%BD%E6%95%B0&fromid=22772270&fr=aladdin

https://blog.csdn.net/jluzhanghm1720/article/details/122262758

https://www.cnblogs.com/YuanShiRenY/p/16523959.html

https://blog.csdn.net/zx1245773445/article/details/86443099

https://blog.csdn.net/weixin_43977534/article/details/107752562

https://blog.csdn.net/qq_43263950/article/details/112237192

 

标签:loss,plt,test,images,train,tf,tensorflow,手写,mnist
From: https://www.cnblogs.com/wancy/p/17390615.html

相关文章

  • 手写分布式事务demo
    这个例子仿照seata的AT模式分布式事务产生: 其中localsql和other方法都是对当前服务数据库进行查询,但remoteMthod接口调用的远程服务库,单纯使用Spring的@Transactional注解无法回滚其他服务 ......
  • 如何使用Java操作TensorFlow
    https://blog.csdn.net/weixin_28906733/article/details/100528526简介机器学习在全球范围内越来越受欢迎和使用。它已经彻底改变了某些应用程序的构建方式,并且可能会继续成为我们日常生活中一个巨大的(并且正在增加的)部分。没有什么包装且机器学习并不简单。它对许多人来......
  • Tensorflow环境搭建教程
    前言笔者在搭建tensorflow环境时遇到了很多问题,浪费了很多时间,为方便想学习机器学习的同学搭建tensorflow环境,笔者整理了一份教程供读者参考。不能直接修改anaconda里的python版本了,另一种更简单的方法:Win10系统用anaconda新建一个tensorflow环境小白教程.一、下载anaconda......
  • tensorflow 输出权重的值
    1.确定权重名称:tvars1=tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES)fortmpintvars1:print('all-->',tmp.name)2.根据网络结构从1中找到想要打印的权重名称weight_name,通过下面的方式进行打印fc_logits=tf.get_default_graph().get_tensor_by_name(weigh......
  • 跟着B站手写redux
    来,跟我一起手写Redux!(建议2倍速播放)_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1dm4y1R7RK/?spm_id_from=333.788&vd_source=fdb6783d7930065bbf3d29c851463887 //src目录结构│App.jsx│index.jsx│redux.jsx│style.css│└─connectersconnectT......
  • tensorflow 更新部分参数或参数分开更新
    思路: 1.根据变量名称过滤要更新的权重: 2.如果参数分开更新,还需要设置多个优化器 代码示例:defNet_1(input):  withtf.variable_scope('Net_1'):    fmap_input=tf.layers.conv2d(input,32,32,(1,1),padding='same',name='conv1')    _,xh,x......
  • LeetCode 周赛 344(2023/05/07)手写递归函数的固定套路
    本文已收录到AndroidFamily,技术和职场问题,请关注公众号[彭旭锐]提问。大家好,我是小彭。今天下午有力扣杯战队赛,不知道官方是不是故意调低早上周赛难度给选手们练练手。往期周赛回顾:LeetCode单周赛第343场·结合「下一个排列」的贪心构造问题周赛概览T1.找出不......
  • 第10章:10W QPS真刀实操__以及基于ZK+Netty手写分布式测试工具 177手机路人甲账号 主目
    10WQPS真刀实操__以及基于ZK+Netty手写分布式测试工具参考链接系统架构知识图谱(一张价值10w的系统架构知识图谱)https://www.processon.com/view/link/60fb9421637689719d246739秒杀系统的架构https://www.processon.com/view/link/61148c2b1e08536191d8f92f10WQPS真刀实......
  • 跟姥爷深度学习5 浅用卷积网络做mnist数字识别
    一、前言前面用TensorFlow浅做了一个温度预测,使用的是全连接网络,同时我们还对网上的示例做了调试和修改,使得预测结果还能看。本篇我们更进一步使用CNN(卷积)网络,不过再预测温度就有点大材小用,所以本篇是做手写数字的识别。手写数字识别是非常经典的分类问题,是入门必备的,门槛又比猫......
  • 利用Tensorflow使用BERT模型+输出句向量和字符向量
    文章目录1.前言2.BERT模型2.1下载预训练好的模型2.2导入BERT模型2.3数据下载和预处理2.4模型训练2.5直接输出BERT模型的句向量或者是字符向量1.前言最近想着如何利用tensorflow调用BERT模型,发现其源码已经有比较详细的调用代码,具体的链接如下:https://github.com/google-resear......