清华AI自强计划作业3-Part3 tensorflow-MNIST-NN

2023-11-23 20:30

本文主要是介绍清华AI自强计划作业3-Part3 tensorflow-MNIST-NN,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

如何将作业提供的神经网络模型优化跑出99%的准确率

导读

mnist数据集基本上可以算做是数据科学里的hello world程序。

对于Part3部分的作业,按照注释部分的提示可以达到96%的准确率。

关于准确率的进一步优化

激活函数

在尝试了不同的激活函数sigmoid、relu、tanh之后,在本次作业的模型里sigmoid的表现较后两者更为出色。

神经元

通过增加A1、A2层的神经元个数同样可以提高训练精度,但神经元的个数并不是越多越好,需要进行不断调试。

学习率

对于学习率的设置,通过调试也可以提高训练精度。注释部分的提示原学习率设为0.01,但经过手动调试之后当Lr=0.05时,可以获得最高的精度。此外,还可以借助TensorFlow提供的一种更灵活的学习率设置方法——指数衰减法。tf.train.exponential_decay函数实现了指数衰减学习率。下面给出一段代码来示范如何在TensorFlow中使用tf.train.exponential_decay函数。

global_step = tf.Variable(0)#通过exponential_decay函数生成学习率。learning_rate = tf.train.exponential_decay(0.1,global_step,100,0.96,staircase=True)# 在训练利用梯度下降法中,使用指数衰减学习率。在minimize函数中传入global_step将自动更新#global_step参数,从而使得学习率也得到相应更新train_step = tf.train.GradientDescentOptimizer(learning_rate)\.minimize(cross_entropy,global_step=global_step)

代码实现

from tensorflow.examples.tutorials.mnist import input_data
import tensorflow as tf# MNIST数据存放的路径
file = "../MNIST"# 导入数据,首先检测file路径下是否存在数据集,若不存在,则到网上下载.
# MNIST下载地址:http://yann.lecun.com/exdb/mnist/
# 注意:下载后需要解压
mnist = input_data.read_data_sets(file, one_hot=True)#读取数据集,标签数据设置为one-hot格式。即n维标签中只有一个数据为1,其余为0# 模型的输入和输出
# 为模型的输入输出申请占位符,作为外部数据与网络模型的交互接口
# 784=28*28
x  = tf.placeholder(tf.float32, shape=[None,784])  #申请占位符 输入图像 N*784的矩阵 [None, 784]
y_ = tf.placeholder(tf.float32, shape=[None,10])  #申请占位符 输入label N*10的矩阵[None, 10]# 将tensor图中的输入和变量进行计算  通过tf.layers.dense搭建全连接网络层,并为该层设置对应的输入、神经元个数、激活函数
# 通过units设置神经元的个数,通过activation设置激活函数,可设定的激活函数,请参考https://tensorflow.google.cn/api_docs/python/tf/nn/softmaxA1 = tf.layers.dense(inputs=x, units=96,activation=tf.nn.sigmoid)  #添加全连接层,神经元个数为96个,激活函数为sigmoid、tanh或relu
A2 = tf.layers.dense(inputs=A1,units=96,activation=tf.nn.sigmoid)  #添加全连接层,神经元个数为96个,激活函数为sigmoid、tanh或relu
y  = tf.layers.dense(inputs=A2,units=10, activation=tf.nn.softmax)  #添加全连接层,设置激活函数为sigmoid或softmax,由于输出类别是10,所以输出层神经元个数为10# 交叉熵 用来度量y_与y之间的差异性
# y_表示样本的标签 one-hot形式 ; y表示tensor流图计算出的值,即预测值
cross_entropy = -tf.reduce_sum(y_*tf.log(y))#对损失求和#global_step = tf.Variable(0)
##learning_rate = tf.train.exponential_decay(0.1,global_step,100,0.96,staircase=True)
# 训练 利用梯度下降法,以0.01的学习率最小化目标函数(cross_entropy)
train_step = tf.train.GradientDescentOptimizer(0.05).minimize(cross_entropy) #设置随机梯度下降的学习率为0.01,最小化目标函数为cross_entropy################################### 测试  ###################################
# 计算模型预测结果与标签中相等的部分
# 调用tf.equal计算模型预测结果y与标签结果y_的差异,预测正确则返回1,预测错误则返回0;
# tf.argmax(y, 1)为计算y中每行数据最大值的索引;
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))# 根据correct_prediction计算模型预测精度
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))# 创建Session,用于启动tensor图
sess = tf.InteractiveSession()# 调用global_variables_initializer函数,将前面定义的Variable变量按照设置的初始化方式,进行初始化
sess.run(tf.global_variables_initializer())  #执行tf.global_variables_initializer(),初始化模型参数#循环训练,设置迭代次数为20000
for i in range(20000):#选取mnist训练数据集,设置minibatchsize为50,即选取样本集中的50个样本batch = mnist.train.next_batch(50)if i% 1000 == 0:train_accuracy = accuracy.eval(feed_dict={x:batch[0],y_:batch[1]})print("step %d, training accuracy %g" % (i, train_accuracy))#启动tensor流图,并执行训练,输入数据为图像(batch[0])和对应的标签(batch[1])train_step.run(feed_dict={x: batch[0], y_: batch[1]})# 启动tensor流图,计算模型预测精度,模型输入数据为train/test的图像和对应标签
print(sess.run(accuracy, feed_dict={x: mnist.train.images, y_:mnist.train.labels}))#计算模型在训练集上的准确率
print(sess.run(accuracy, feed_dict={x: mnist.test.images,  y_:mnist.test.labels}))#计算模型在测试集上的准确率# 结果输出
logFileName = "logText.txt"
logFile = open(logFileName, "w")
logFile.write(str(sess.run(accuracy, feed_dict={x: mnist.train.images, y_:mnist.train.labels})))
logFile.write("\n")
logFile.write(str(sess.run(accuracy, feed_dict={x: mnist.test.images,  y_:mnist.test.labels})))
logFile.close()

运行结果

在这里插入图片描述

参考资料

https://tensorflow.google.cn/api_docs/python/
TensorFlow实战Google深度学习框架(第2版)

这篇关于清华AI自强计划作业3-Part3 tensorflow-MNIST-NN的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/420553

相关文章

Linux之计划任务和调度命令at/cron详解

《Linux之计划任务和调度命令at/cron详解》:本文主要介绍Linux之计划任务和调度命令at/cron的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux计划任务和调度命令at/cron一、计划任务二、命令{at}介绍三、命令语法及功能 :at

pytorch之torch.flatten()和torch.nn.Flatten()的用法

《pytorch之torch.flatten()和torch.nn.Flatten()的用法》:本文主要介绍pytorch之torch.flatten()和torch.nn.Flatten()的用... 目录torch.flatten()和torch.nn.Flatten()的用法下面举例说明总结torch

Linux中的计划任务(crontab)使用方式

《Linux中的计划任务(crontab)使用方式》:本文主要介绍Linux中的计划任务(crontab)使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、前言1、linux的起源与发展2、什么是计划任务(crontab)二、crontab基础1、cro

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

Spring AI ectorStore的使用流程

《SpringAIectorStore的使用流程》SpringAI中的VectorStore是一种用于存储和检索高维向量数据的数据库或存储解决方案,它在AI应用中发挥着至关重要的作用,本文给大家介... 目录一、VectorStore的基本概念二、VectorStore的核心接口三、VectorStore的

Spring AI集成DeepSeek三步搞定Java智能应用的详细过程

《SpringAI集成DeepSeek三步搞定Java智能应用的详细过程》本文介绍了如何使用SpringAI集成DeepSeek,一个国内顶尖的多模态大模型,SpringAI提供了一套统一的接口,简... 目录DeepSeek 介绍Spring AI 是什么?Spring AI 的主要功能包括1、环境准备2

Spring AI集成DeepSeek实现流式输出的操作方法

《SpringAI集成DeepSeek实现流式输出的操作方法》本文介绍了如何在SpringBoot中使用Sse(Server-SentEvents)技术实现流式输出,后端使用SpringMVC中的S... 目录一、后端代码二、前端代码三、运行项目小天有话说题外话参考资料前面一篇文章我们实现了《Spring

Spring AI与DeepSeek实战一之快速打造智能对话应用

《SpringAI与DeepSeek实战一之快速打造智能对话应用》本文详细介绍了如何通过SpringAI框架集成DeepSeek大模型,实现普通对话和流式对话功能,步骤包括申请API-KEY、项目搭... 目录一、概述二、申请DeepSeek的API-KEY三、项目搭建3.1. 开发环境要求3.2. mav

C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)

《C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)》本文主要介绍了C#集成DeepSeek模型实现AI私有化的方法,包括搭建基础环境,如安装Ollama和下载DeepS... 目录前言搭建基础环境1、安装 Ollama2、下载 DeepSeek R1 模型客户端 ChatBo

Spring AI集成DeepSeek的详细步骤

《SpringAI集成DeepSeek的详细步骤》DeepSeek作为一款卓越的国产AI模型,越来越多的公司考虑在自己的应用中集成,对于Java应用来说,我们可以借助SpringAI集成DeepSe... 目录DeepSeek 介绍Spring AI 是什么?1、环境准备2、构建项目2.1、pom依赖2.2