2018-04-03 随机dropout

为了预防神经网络过拟合,使用dropout,主要思想好像是每次随机的搞掉一半神经元使它们不能工作,这样训练出来就能防止过拟合。
这里的示例代码还用到了sklearn的数据集。

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=.3)

这里是从sklearn自带的数据集里提取出来,下面是sklearn里的那些数据集,比如digits就是手写体数据集。

In [2]: datasets.load_*?  
datasets.load_boston#波士顿房价数据集  
datasets.load_breast_cancer#乳腺癌数据集  
datasets.load_diabetes#糖尿病数据集  
datasets.load_digits#手写体数字数据集  
datasets.load_files  
datasets.load_iris#鸢尾花数据集  
datasets.load_lfw_pairs  
datasets.load_lfw_people  
datasets.load_linnerud#体能训练数据集  
datasets.load_mlcomp  
datasets.load_sample_image  
datasets.load_sample_images  
datasets.load_svmlight_file  
datasets.load_svmlight_files 

train_test_split这个函数看上去非常有用,其中test_size这个参数是设置测试集的比例,这个例子里还没用到验证集。

keep_prob = tf.placeholder(tf.float32)
xs = tf.placeholder(tf.float32, [None, 64])  # 8x8
ys = tf.placeholder(tf.float32, [None, 10])

placeholder里增加了一个keep prob,这里的keep_prob是保留概率,即我们要保留的结果所占比例,它作为一个placeholder,在run时传入, 当keep_prob=1的时候,相当于100%保留,也就是dropout没有起作用。
关于softmax和jcross_entropy的理论看了一些还是不懂,可能要等到以后看其他教程的时候再说吧。

l1 = add_layer(xs, 64, 50, 'l1', activation_function=tf.nn.tanh)
prediction = add_layer(l1, 50, 10, 'l2', activation_function=tf.nn.softmax)

cross_entropy = tf.reduce_mean(-tf.reduce_sum(ys * tf.log(prediction),reduction_indices=[1]))#loss

tf.summary.scalar('loss',cross_entropy)
train_step=tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)

dropout的内容主要是在增加了一个keep_prob的placeholder 然后放在了
每一步的trainstep的feed_dict里面

for i in range(500):
    sess.run(train_step,feed_dict={xs:X_train,ys:y_train,keep_prob:0.5})
    if i % 50 ==0:
        train_result=sess.run(merged,feed_dict={xs:X_train,ys:y_train,keep_prob:1})
        test_result = sess.run(merged,feed_dict={xs:X_test,ys:y_test,keep_prob:1})
        train_writer.add_summary(train_result,i)
        test_writer.add_summary(test_result,i)

你可能感兴趣的:(2018-04-03 随机dropout)