tf.nn.dropout的使用-创新互联

神经网络在设置的神经网络足够复杂的情况下,可以无限逼近一段非线性连续函数,但是如果神经网络设置的足够复杂,将会导致过拟合(overfitting)的出现,就好像下图这样。

创新互联公司长期为1000多家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为德江企业提供专业的网站制作、网站建设,德江网站改版等技术服务。拥有十多年丰富建站经验和众多成功案例,为您定制开发。

看到这个蓝色曲线,我就知道:

很明显蓝色曲线是overfitting的结果,尽管它很好的拟合了每一个点的位置,但是曲线是歪歪曲曲扭扭捏捏的,这个的曲线不具有良好的鲁棒性,在实际工程实验中,我们更希望得到如黑色线一样的曲线。

tf.nn.dropout函数介绍

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:无锡妇科医院 http://www.bhnnk120.com/

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)

keep_prob = 0.5

训练结果为:

训练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的图像:

keep_prob = 1

训练结果为:

训练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的训练集和测试集的曲线更加贴近。

另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


分享文章:tf.nn.dropout的使用-创新互联
标题来源:http://myzitong.com/article/dcosjc.html