Python tensorflow函数tf.nn.dropout是什么
Admin 2022-09-16 群英技术资讯 305 次浏览
神经网络在设置的神经网络足够复杂的情况下,可以无限逼近一段非线性连续函数,但是如果神经网络设置的足够复杂,将会导致过拟合(overfitting)的出现,就好像下图这样。
看到这个蓝色曲线,我就知道:
很明显蓝色曲线是overfitting的结果,尽管它很好的拟合了每一个点的位置,但是曲线是歪歪曲曲扭扭捏捏的,这个的曲线不具有良好的鲁棒性,在实际工程实验中,我们更希望得到如黑色线一样的曲线。
tf.nn.dropout是tensorflow的好朋友,它的作用是为了减轻过拟合带来的问题而使用的函数,它一般用在每个连接层的输出。
Dropout就是在不同的训练过程中,按照一定概率使得某些神经元停止工作。也就是让每个神经元按照一定的概率停止工作,这次训练过程中不更新权值,也不参加神经网络的计算。但是它的权重依然存在,下次更新时可能会使用到它。
def dropout(x, keep_prob, noise_shape=None, seed=None, name=None)
x 一般是每一层的输出
keep_prob,保留keep_prob的神经元继续工作,其余的停止工作与更新
在实际定义每一层神经元的时候,可以加入dropout。
def add_layer(inputs,in_size,out_size,n_layer,activation_function = None,keep_prob = 1): layer_name = 'layer%s'%n_layer with tf.name_scope(layer_name): with tf.name_scope("Weights"): Weights = tf.Variable(tf.random_normal([in_size,out_size]),name = "Weights") tf.summary.histogram(layer_name+"/weights",Weights) with tf.name_scope("biases"): biases = tf.Variable(tf.zeros([1,out_size]) + 0.1,name = "biases") tf.summary.histogram(layer_name+"/biases",biases) with tf.name_scope("Wx_plus_b"): Wx_plus_b = tf.matmul(inputs,Weights) + biases #dropout一般加载每个神经层的输出 Wx_plus_b = tf.nn.dropout(Wx_plus_b,keep_prob) #看这里看这里,dropout在这里。 tf.summary.histogram(layer_name+"/Wx_plus_b",Wx_plus_b) if activation_function == None : outputs = Wx_plus_b else: outputs = activation_function(Wx_plus_b) tf.summary.histogram(layer_name+"/outputs",outputs) return outputs
但需要注意的是,神经元的输出层不可以定义dropout参数。因为输出层就是输出的是结果,在输出层定义参数的话,就会导致输出结果被dropout掉。
本次例子使用sklearn.datasets,在进行测试的时候,我们只需要改变最下方keep_prob:0.5的值即可,1代表不进行dropout。
import tensorflow as tf from sklearn.datasets import load_digits from sklearn.model_selection import train_test_split from sklearn.preprocessing import LabelBinarizer digits = load_digits() X = digits.data y = digits.target y = LabelBinarizer().fit_transform(y) X_train,X_test,Y_train,Y_test = train_test_split(X,y,test_size = 500) def add_layer(inputs,in_size,out_size,n_layer,activation_function = None,keep_prob = 1): layer_name = 'layer%s'%n_layer with tf.name_scope(layer_name): with tf.name_scope("Weights"): Weights = tf.Variable(tf.random_normal([in_size,out_size]),name = "Weights") tf.summary.histogram(layer_name+"/weights",Weights) with tf.name_scope("biases"): biases = tf.Variable(tf.zeros([1,out_size]) + 0.1,name = "biases") tf.summary.histogram(layer_name+"/biases",biases) with tf.name_scope("Wx_plus_b"): Wx_plus_b = tf.matmul(inputs,Weights) + biases Wx_plus_b = tf.nn.dropout(Wx_plus_b,keep_prob) tf.summary.histogram(layer_name+"/Wx_plus_b",Wx_plus_b) if activation_function == None : outputs = Wx_plus_b else: outputs = activation_function(Wx_plus_b) tf.summary.histogram(layer_name+"/outputs",outputs) return outputs def compute_accuracy(x_data,y_data,prob = 1): global prediction y_pre = sess.run(prediction,feed_dict = {xs:x_data,keep_prob:prob}) correct_prediction = tf.equal(tf.arg_max(y_data,1),tf.arg_max(y_pre,1)) accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32)) result = sess.run(accuracy,feed_dict = {xs:x_data,ys:y_data,keep_prob:prob}) return result keep_prob = tf.placeholder(tf.float32) xs = tf.placeholder(tf.float32,[None,64]) ys = tf.placeholder(tf.float32,[None,10]) l1 = add_layer(xs,64,100,'l1',activation_function=tf.nn.tanh, keep_prob = keep_prob) l2 = add_layer(l1,100,100,'l2',activation_function=tf.nn.tanh, keep_prob = keep_prob) prediction = add_layer(l1,100,10,'l3',activation_function = tf.nn.softmax, keep_prob = 1) with tf.name_scope("loss"): loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=ys,logits = prediction),name = 'loss') tf.summary.scalar("loss",loss) train = tf.train.AdamOptimizer(0.01).minimize(loss) init = tf.initialize_all_variables() merged = tf.summary.merge_all() with tf.Session() as sess: sess.run(init) train_writer = tf.summary.FileWriter("logs/strain",sess.graph) test_writer = tf.summary.FileWriter("logs/test",sess.graph) for i in range(5001): sess.run(train,feed_dict = {xs:X_train,ys:Y_train,keep_prob:0.5}) if i % 500 == 0: print("训练%d次的识别率为:%f。"%((i+1),compute_accuracy(X_test,Y_test,prob=0.5))) train_result = sess.run(merged,feed_dict={xs:X_train,ys:Y_train,keep_prob:0.5}) test_result = sess.run(merged,feed_dict={xs:X_test,ys:Y_test,keep_prob:0.5}) train_writer.add_summary(train_result,i) test_writer.add_summary(test_result,i)
训练结果为:
训练1次的识别率为:0.086000。
训练501次的识别率为:0.890000。
训练1001次的识别率为:0.938000。
训练1501次的识别率为:0.952000。
训练2001次的识别率为:0.952000。
训练2501次的识别率为:0.946000。
训练3001次的识别率为:0.940000。
训练3501次的识别率为:0.932000。
训练4001次的识别率为:0.970000。
训练4501次的识别率为:0.952000。
训练5001次的识别率为:0.950000。
这是keep_prob = 0.5时tensorboard中的loss的图像:
训练结果为:
训练1次的识别率为:0.160000。
训练501次的识别率为:0.754000。
训练1001次的识别率为:0.846000。
训练1501次的识别率为:0.854000。
训练2001次的识别率为:0.852000。
训练2501次的识别率为:0.852000。
训练3001次的识别率为:0.860000。
训练3501次的识别率为:0.854000。
训练4001次的识别率为:0.856000。
训练4501次的识别率为:0.852000。
训练5001次的识别率为:0.852000。
这是keep_prob = 1时tensorboard中的loss的图像:
可以明显看出来keep_prob = 0.5的训练集和测试集的曲线更加贴近。
关于“Python tensorflow函数tf.nn.dropout是什么”的内容今天就到这,感谢各位的阅读,大家可以动手实际看看,对大家加深理解更有帮助哦。如果想了解更多相关内容的文章,关注我们,群英网络小编每天都会为大家更新不同的知识。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章主要介绍了Python包装异常处理方法,相比java,python的异常和java中不同,python主要是防止程序异常被中止。一旦被catch后它还行往下执行,本文就分享python相关的异常处理方法,需要的小伙伴可以参考一下
Python语法定义了用于在 Python 编程中创建句子的所有规则集。如果想更深入地研究 Python 词法结构,需要了解构成语句的句法元素,即构成 Python 程序的基本单元,涵盖控制结构,在不同代码组之间引导程序流的构造,快跟随小编一起学习一下吧
从ZoomEye到BugScan,再到TangScan,大型的Poc/EXP平台越来越多,各种扫描器也层出不穷。Web安全的门槛越来越高,自动化的渗透已经成了一种趋势。我一直梦想着,将来渗透的时候,先打开自己写的各种自动化工具,输入目标,然后喝着咖啡,刷着知乎,最后只需要把工具的分析报告整理整理就可以了。事实上,现在的扫描器也正在向这个方向发展,期待一键getshell的那一天。
这篇文章主要介绍了Python实现 MK检验,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
这篇文章主要为大家详细介绍了常见的一些JS加密,并记录了JS和Python的实现方式,主要有base64编码伪加密、MD5、SHAI等,需要的可以参考一下
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008