使用TensorFlow实现MNIST数据集分类
数据 实现 分类 Tensorflow mnist 使用
2023-09-11 14:20:52 时间
1 MNIST数据集
MNIST数据集由70000张28x28像素的黑白图片组成,每一张图片都写有0~9中的一个数字,每个像素点的灰度值在0 ~ 255(0是黑色,255是白色)之间。
MINST数据集是由Yann LeCun教授提供的手写数字数据库文件,其官方下载地址THE MNIST DATABASE of handwritten digits
下载好MNIST数据集后,将其放在Spyder工作目录下(若使用Jupyter编程,则放在Jupyter工作目录下),如图:
G:\Anaconda\Spyder为笔者Spyder工作目录,MNIST_data为新建文件夹,读者也可以自行命名。
2 实验
为方便设计神经网络输入层,将每张28x28像素图片的像素值按行排成一行,故输入层设计28x28=784个神经元,隐藏层设计600个神经元,输出层设计10个神经元。使用read_data_sets()函数载入数据集,并返回一个类,这个类将MNIST数据集划分为train、validation、test 3个数据集,对应图片数分别为55000、5000、10000。本文采用交叉熵损失函数,并且为防止过拟合问题产生,引入正则化方法。
mnist.py
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
#载入数据集
mnist=input_data.read_data_sets("MNIST_data",one_hot=True)
#每批次的大小
batch_size=100
#总批次数
batch_num=mnist.train.num_examples//batch_size
#训练轮数
training_step = tf.Variable(0,trainable=False)
#定义两个placeholder
x=tf.placeholder(tf.float32, [None,784])
y=tf.placeholder(tf.float32, [None,10])
#神经网络layer_1
w1=tf.Variable(tf.random_normal([784,600]))
b1=tf.Variable(tf.constant(0.1,shape=[600]))
z1=tf.matmul(x,w1)+b1
a1=tf.nn.tanh(z1)
#神经网络layer_2
w2=tf.Variable(tf.random_normal([600,10]))
b2=tf.Variable(tf.constant(0.1,shape=[10]))
z2=tf.matmul(a1,w2)+b2
#交叉熵代价函数
cross_entropy=tf.nn.sparse_softmax_cross_entropy_with_logits(labels=tf.argmax(y,1),logits=z2)
#cross_entropy=tf.nn.softmax_cross_entropy_with_logits_v2(labels=y,logits=z2)
#L2正则化函数
regularizer=tf.contrib.layers.l2_regularizer(0.0001)
#总损失
loss=tf.reduce_mean(cross_entropy)+regularizer(w1)+regularizer(w2)
#学习率(指数衰减法)
laerning_rate = tf.train.exponential_decay(0.8,training_step,batch_num,0.999)
#梯度下降法优化器
train=tf.train.GradientDescentOptimizer(laerning_rate).minimize(loss,global_step=training_step)
#预测精度
correct_prediction=tf.equal(tf.argmax(y,1),tf.argmax(z2,1))
accuracy=tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
#初始化变量
init=tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
test_feed={x:mnist.test.images,y:mnist.test.labels}
for epoch in range(51):
for batch in range(batch_num):
x_,y_=mnist.train.next_batch(batch_size)
sess.run(train,feed_dict={x:x_,y:y_})
acc=sess.run(accuracy,feed_dict=test_feed)
if epoch%10==0:
print("epoch:",epoch,"accuracy:",acc)
迭代50次后,精度达到97.68%。
相关文章
- 新闻发布项目——数据实现类(UserDaoImpl)
- 使用HIVE SQL实现推荐系统数据补全
- Java实现 LeetCode 442 数组中重复的数据
- Java实现 蓝桥杯VIP 算法训练 链表数据求和操作
- js es6 reduce用法示例:实现数据累加
- 【STM32H7的DSP教程】第46章 STM32H7的IIR带通滤波器实现(支持逐个数据的实时滤波)
- 深入学习 SAP UI5 框架代码系列之六:SAP UI5 控件数据绑定的实现原理
- ML之shap:基于adult人口普查收入二分类预测数据集(预测年收入是否超过50k)利用Shap值对XGBoost模型实现可解释性案例之详细攻略
- ML之catboost:基于自带Pool数据集实现二分类预测
- ML之xgboost:利用xgboost算法对breast_cancer数据集实现二分类预测并使用可视化工具Graphviz将dot格式数据文件转为结构图的图片格式
- DataScience:数据预处理/特征工程之两大类别特征、四大数据类型(数值型/类别型/字符串型/时间型简介、代码实现(数值型特征离散化/类别型特征编码数字化)、案例应用之详细攻略
- MAT之SVM:SVM之分类预测根据已有大量数据集案例,输入已有病例的特征向量实现乳腺癌诊断高准确率预测
- ML之shap:基于FIFA 2018 Statistics(2018年俄罗斯世界杯足球赛)球队比赛之星分类预测数据集利用RF随机森林+计算SHAP值单样本力图/依赖关系贡献图可视化实现可解释性之攻略
- ML之FE:特征工程/数据预处理中的划分特征类型/数据类型划分(类别型、数字型)的多种实现方法之详细攻略
- ML之分类预测:基于sklearn库的七八种机器学习算法利用糖尿病(diabetes)数据集(8→1)实现二分类预测
- ML之catboost:基于人类性别相关属性的数据集利用catboost模型实现二分类预测(男女性别预测,全流程案例,包括代码实现)
- ML之catboost:基于自带Pool数据集实现二分类预测
- ML之KG:基于MovieLens电影评分数据集利用基于知识图谱的推荐算法(networkx+基于路径相似度的方法)实现对用户进行Top电影推荐案例
- DL之CNN:利用自定义DeepConvNet【7+1】算法对mnist数据集训练实现手写数字识别、模型评估(99.4%)
- TF之AE:AE实现TF自带数据集AE的encoder之后decoder之前的非监督学习分类
- 【图像分类】基于 CNN 和混合/随机配对的数据增强方法进行图像分类(Matlab代码实现)
- 使用MRS CDL实现实时数据同步的极致性能
- 【项目实战】Python实现基于LDA主题模型进行电商产品评论数据情感分析
- 【华为OD机试Python实现】HJ25 数据分类处理(较难)
- 【华为机试真题 Python实现】数据分类【2022 Q1 Q2 |200分】
- java对象和json数据转换实现方式3-使用jackson实现
- 13. SAP ABAP OData 服务的分页加载数据集的实现(Paging)
- Keras之DNN:利用DNN【Input(8)→(12+8)(relu)→O(sigmoid)】模型实现预测新数据(利用糖尿病数据集的八个特征进行二分类预测
- python工具方法 26 应用于图像分类的mixup与cutmix数据混合增强方式实现