TensorFlow+实战Google深度学习框架学习笔记(11)-----Mnist识别【采用滑动平均,双层神经网络】
模型:双层神经网络
【一层隐藏层、一层输出层】隐藏层输出用relu函数,输出层输出用softmax函数
过程:
- 设置参数
- 滑动平均的辅助函数
- 训练函数
- x,y的占位,w1,b1,w2,b2的初始化
- 前向传播【y = w * x +b,w和b采用滑动平均更新】
- 后向传播【计算loss(包括交叉熵和正则化loss),采用GD更新参数(学习率使用指数衰减)】
- 迭代训练数据
代码:
#参数设置
#输入、隐藏层神经元数、输出
samples = 55000
input_size = 784
output_size = 10
cell = 500
#训练次数,batch大小
training_step = 30000
batch_size = 100
#初始学习率、学习率衰减率、滑动平均衰减率、正则化系数
learning_rate = 0.8
learning_rate_decay = 0.99
moving_average_decay = 0.99
regulization_rate = 0.0001 #滑动平均的辅助函数
def moving_average_helper(input_x , ave_class , w1 , b1 , w2 , b2):
if ave_class == None:
layer1 = tf.nn.relu(tf.matmul(input_x,w1) + b1)
y_pre = tf.matmul(layer1,w2) + b2
else:
layer1 = tf.nn.relu(tf.matmul(input_x,ave_class.average(w1)) + ave_class.average(b1))
y_pre = tf.matmul(layer1,ave_class.average(w2)) + ave_class.average(b2)
return y_pre #建立模型、前向传播、后向传播,开始训练
def train(mnist,samples,input_size,output_size,cell,training_step,learning_rate,batch_size,learning_rate_decay,moving_average_decay,regulization_rate): ############################################################################
#输入和输出
x = tf.placeholder(tf.float32, [None,input_size] , name = 'x_input')
y = tf.placeholder(tf.float32, [ None,output_size] , name = 'y_output') #参数
w1 = tf.Variable(tf.truncated_normal([input_size,cell],stddev = 0.1))
b1 = tf.Variable(tf.constant(0.1,shape = [cell])) w2 = tf.Variable(tf.truncated_normal([cell,output_size],stddev = 0.1))
b2 = tf.Variable(tf.constant(0.1,shape = [output_size])) #不使用滑动平均
y_pre = moving_average_helper(x , None , w1 , b1 , w2 , b2)
############################################################################
#使用滑动平均计算预测值
global_step = tf.Variable(0,trainable=False)
ave_class = tf.train.ExponentialMovingAverage(moving_average_decay,global_step)
variable_ave = ave_class.apply(tf.trainable_variables())
moving_y_pre = moving_average_helper(x , ave_class , w1 , b1 , w2 , b2) y_ = moving_y_pre
#计算交叉熵loss
cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=y,labels=tf.argmax(y_,1)) #是一个计算softmax且计算交叉熵的函数,其参数第一个为实际的y,第二个为预测的y的最大值索引值
cross_entropy_mean = tf.reduce_mean(cross_entropy) #计算所有样本的交叉熵平均值 #计算l2正则化loss
regularizer = tf.contrib.layers.l2_regularizer(regulization_rate)
regularization = regularizer(w1) + regularizer(w2) #计算loss
loss = cross_entropy_mean + regularization #设置指数衰减的学习率
newlearning_rate = tf.train.exponential_decay(learning_rate,global_step,samples/batch_size,learning_rate_decay) #优化损失函数
train_step = tf.train.GradientDescentOptimizer(newlearning_rate).minimize(loss , global_step = global_step) #同时训练参数和其滑动平均值
#train_op = tf.group(train_step,ave_class) with tf.control_dependencies([train_step, variable_ave]):
train_op = tf.no_op(name='train')
#计算准确度
correct = tf.equal(tf.argmax(y,1),tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(correct,tf.float32))
###############################################################################
with tf.Session() as sess:
tf.initialize_all_variables().run()
validate_feed = {x:mnist.validation.images,y:mnist.validation.labels}
test_feed = {x:mnist.test.images,y:mnist.test.labels} #循环迭代训练
for i in range(training_step):
if i % 1000 == 0:
validate_acc = sess.run(accuracy,feed_dict=validate_feed)
print('第%d验证集准确度%g:',%(i,validate_acc))
xs , ys = mnist.train.next_batch(batch_size)
sess.run(train_op,feed_dict={x:xs,y:ys})
test_acc = sess.run(accuracy,feed_dict=test_feed)
print("测试集准确度:",test_acc)
结果:
第%d验证集准确度%g: (0, 0.0924)
第%d验证集准确度%g: (1000, 0.0918)
第%d验证集准确度%g: (2000, 0.0922)
第%d验证集准确度%g: (3000, 0.0912)
第%d验证集准确度%g: (4000, 0.0912)
第%d验证集准确度%g: (5000, 0.0916)
第%d验证集准确度%g: (6000, 0.0914)
第%d验证集准确度%g: (7000, 0.0922)
第%d验证集准确度%g: (8000, 0.092)
第%d验证集准确度%g: (9000, 0.0922)
第%d验证集准确度%g: (10000, 0.0914)
第%d验证集准确度%g: (11000, 0.0918)
第%d验证集准确度%g: (12000, 0.092)
第%d验证集准确度%g: (13000, 0.093)
第%d验证集准确度%g: (14000, 0.0934)
第%d验证集准确度%g: (15000, 0.093)
第%d验证集准确度%g: (16000, 0.0928)
第%d验证集准确度%g: (17000, 0.0928)
第%d验证集准确度%g: (18000, 0.0922)
第%d验证集准确度%g: (19000, 0.0932)
第%d验证集准确度%g: (20000, 0.0934)
第%d验证集准确度%g: (21000, 0.094)
第%d验证集准确度%g: (22000, 0.0944)
第%d验证集准确度%g: (23000, 0.0946)
第%d验证集准确度%g: (24000, 0.0936)
第%d验证集准确度%g: (25000, 0.0964)
第%d验证集准确度%g: (26000, 0.097)
第%d验证集准确度%g: (27000, 0.097)
第%d验证集准确度%g: (28000, 0.0974)
第%d验证集准确度%g: (29000, 0.0976)
测试集准确度: 0.0887
常用函数解释:
tf.trainable_variables :
返回所有 当前计算图中 在获取变量时未标记 trainable=False
的变量集合。【可用来更新所有参数时使用】
tf.control_dependencies(control_inputs):
此函数指定某些操作执行的依赖关系
返回一个控制依赖的上下文管理器,使用 with 关键字可以让在这个上下文环境中的操作都在 control_inputs 执行
1 with tf.control_dependencies([a, b]):
2 c = ....
3 d = ...
在执行完 a,b 操作之后,才能执行 c,d 操作。意思就是 c,d 操作依赖 a,b 操作
1 with tf.control_dependencies([train_step, variable_averages_op]):
2 train_op = tf.no_op(name='train')
tf.no_op():表示执行完 train_step, variable_averages_op 操作之后什么都不做
tf.group:
用于创造一个操作,可以将传入参数的所有操作进行分组,返回也是一个操作。
ops = tf.group(tensor1, tensor2,...)
其中*inputs
是0个或者多个用于组合tensor,一旦ops
完成了,那么传入的tensor1,tensor2,...
等等都会完成了,经常用于组合一些训练节点,
tf.control_dependencies和tf.group两种机制可以用来实现一次完成多个操作。如以下两个程序是等价的:【为了一次实现train_step, variable_averages_op两个操作】
with tf.control_dependencies([train_step, variable_averages_op]): train_op = tf.no_op(name='train') ############################################ train_op = tf.group(train_step,variables_averages_op)
tf.cast()
cast(
x,
dtype,
name=None
)
将x的数据格式转化成dtype.例如,原来x的数据格式是bool,
那么将其转化成float以后,就能够将其转化成0和1的序列。反之也可以。
TensorFlow+实战Google深度学习框架学习笔记(11)-----Mnist识别【采用滑动平均,双层神经网络】的更多相关文章
- [Tensorflow实战Google深度学习框架]笔记4
本系列为Tensorflow实战Google深度学习框架知识笔记,仅为博主看书过程中觉得较为重要的知识点,简单摘要下来,内容较为零散,请见谅. 2017-11-06 [第五章] MNIST数字识别问题 ...
- TensorFlow+实战Google深度学习框架学习笔记(5)----神经网络训练步骤
一.TensorFlow实战Google深度学习框架学习 1.步骤: 1.定义神经网络的结构和前向传播的输出结果. 2.定义损失函数以及选择反向传播优化的算法. 3.生成会话(session)并且在训 ...
- 1 如何使用pb文件保存和恢复模型进行迁移学习(学习Tensorflow 实战google深度学习框架)
学习过程是Tensorflow 实战google深度学习框架一书的第六章的迁移学习环节. 具体见我提出的问题:https://www.tensorflowers.cn/t/5314 参考https:/ ...
- 学习《TensorFlow实战Google深度学习框架 (第2版) 》中文PDF和代码
TensorFlow是谷歌2015年开源的主流深度学习框架,目前已得到广泛应用.<TensorFlow:实战Google深度学习框架(第2版)>为TensorFlow入门参考书,帮助快速. ...
- TensorFlow实战Google深度学习框架10-12章学习笔记
目录 第10章 TensorFlow高层封装 第11章 TensorBoard可视化 第12章 TensorFlow计算加速 第10章 TensorFlow高层封装 目前比较流行的TensorFlow ...
- TensorFlow实战Google深度学习框架5-7章学习笔记
目录 第5章 MNIST数字识别问题 第6章 图像识别与卷积神经网络 第7章 图像数据处理 第5章 MNIST数字识别问题 MNIST是一个非常有名的手写体数字识别数据集,在很多资料中,这个数据集都会 ...
- TensorFlow实战Google深度学习框架1-4章学习笔记
目录 第1章 深度学习简介 第2章 TensorFlow环境搭建 第3章 TensorFlow入门 第4章 深层神经网络 第1章 深度学习简介 对于许多机器学习问题来说,特征提取不是一件简单的事情 ...
- TensorFlow+实战Google深度学习框架学习笔记(10)-----神经网络几种优化方法
神经网络的优化方法: 1.学习率的设置(指数衰减) 2.过拟合问题(Dropout) 3.滑动平均模型(参数更新,使模型在测试数据上更鲁棒) 4.批标准化(解决网络层数加深而产生的问题---如梯度弥散 ...
- TensorFlow实战Google深度学习框架-人工智能教程-自学人工智能的第二天-深度学习
自学人工智能的第一天 "TensorFlow 是谷歌 2015 年开源的主流深度学习框架,目前已得到广泛应用.本书为 TensorFlow 入门参考书,旨在帮助读者以快速.有效的方式上手 T ...
- 实现迁徙学习-《Tensorflow 实战Google深度学习框架》代码详解
为了实现迁徙学习,首先是数据集的下载 #利用curl下载数据集 curl -o flower_photos.tgz http://download.tensorflow.org/example_ima ...
随机推荐
- (8). 使用JPA保存数据【从零开始学Spring Boot】
在看这一篇文档的话,需要先配置好JPA – Hibernate. 总体步骤: (1) 创建实体类Demo,如果已经存在,可以忽略. (2) 创建jpa repository类操作持久化. (3 ...
- [bzoj1090][SCOI2003]字符串折叠_区间dp
字符串折叠 bzoj-1090 SCOI-2003 题目大意:我说不明白...链接 注释:自己看 想法:动态规划 状态:dp[i][j]表示从第i个字符到第j个字符折叠后的最短长度. 转移:dp[l] ...
- error at ::0 can't find referenced pointcut...解决方法
error at ::0 can't find referenced pointcut...解决方法 学习了:http://dyldragon.iteye.com/blog/512612 升级aspe ...
- Qt由pcm数据生成wav文件
void AudioGrabber::saveWave(const QString &fileName, const QByteArray &raw, const QAudioForm ...
- Unity3d数据加密
在unity中能够使用c#自带的对称算法对数据进行加密,以下两种加密算法: using System; using System.Text; using System.Security.Cryptog ...
- Connect the Cities--hdoj
Connect the Cities Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) ...
- [POJ 3621] Sightseeing Cows
[题目链接] http://poj.org/problem?id=3621 [算法] 01分数规划(最优比率环) [代码] #include <algorithm> #include &l ...
- 纯JS监听document是否加载完成
欢迎加入前端交流群交流知识&&获取视频资料:749539640 概述 一个document 的 Document.readyState 属性描述了文档的加载状态. 一个文档的 read ...
- Linux系统查看当前时间的命令
转自:https://www.cnblogs.com/redfire/p/7702213.html 一.查看和修改Linux的时区1. 查看当前时区命令 : "date -R"2. ...
- php 判断字符串包含中文(转)
$str = "测试中文"; echo $str; echo "<hr>"; //if (preg_match("/^[".ch ...