1、dropout
dropout 是指在深度學習網絡的訓練過程中,按照一定的概率將一部分神經網絡單元暫時從網絡中丟棄,相當於從原始的網絡中找到一個更瘦的網絡,這篇博客中講的非常詳細

2、tensorflow實現
用dropout:
import tensorflow as tf import numpy as np x_data=np.linspace(-1.,1.,300)[:, np.newaxis] noise=np.random.normal(0,0.05,x_data.shape) y_data=np.square(x_data)+noise def add_layer(input,in_size,out_size,activation_function=None,dropout_function=False): Weights=tf.Variable(tf.random_normal([in_size,out_size])) biases=tf.Variable(tf.zeros([1,out_size])+0.1) Wx_plus_b=tf.matmul(input,Weights)+biases if dropout_function==True: Wx_plus_b=tf.nn.dropout(Wx_plus_b,keep_prob=0.5) else: pass if activation_function is None: outputs=Wx_plus_b else: outputs=activation_function(Wx_plus_b) return outputs xs = tf.placeholder(tf.float32, [None, 1]) ys = tf.placeholder(tf.float32, [None, 1]) layer1=add_layer(xs,1,10,activation_function=tf.nn.relu,dropout_function=True) predict=add_layer(layer1,10,1) loss=tf.reduce_mean(tf.reduce_sum(tf.square(ys-predict),reduction_indices=[1])) train_step=tf.train.GradientDescentOptimizer(0.1).minimize(loss) init=tf.global_variables_initializer() sess=tf.Session() sess.run(init) for i in range(100): sess.run(train_step,feed_dict={xs: x_data,ys: y_data}) if i%5==0: print(sess.run(loss,feed_dict={xs:x_data,ys:y_data}))
輸出結果:
1.87953
0.294975
0.173229
0.122831
0.0859246
0.0712419
0.0839021
0.0572673
0.0676766
0.0584741
0.0556422
0.0576011
0.0534098
0.0472549
0.0528496
0.0427771
0.0485248
0.0502765
0.0454531
0.0516633
不用dropout:
import tensorflow as tf import numpy as np x_data=np.linspace(-1.,1.,300)[:, np.newaxis] noise=np.random.normal(0,0.05,x_data.shape) y_data=np.square(x_data)+noise def add_layer(input,in_size,out_size,activation_function=None,dropout_function=False): Weights=tf.Variable(tf.random_normal([in_size,out_size])) biases=tf.Variable(tf.zeros([1,out_size])+0.1) Wx_plus_b=tf.matmul(input,Weights)+biases if dropout_function==True: Wx_plus_b=tf.nn.dropout(Wx_plus_b,keep_prob=1) else: pass if activation_function is None: outputs=Wx_plus_b else: outputs=activation_function(Wx_plus_b) return outputs xs = tf.placeholder(tf.float32, [None, 1]) ys = tf.placeholder(tf.float32, [None, 1]) layer1=add_layer(xs,1,10,activation_function=tf.nn.relu) predict=add_layer(layer1,10,1) loss=tf.reduce_mean(tf.reduce_sum(tf.square(ys-predict),reduction_indices=[1])) train_step=tf.train.GradientDescentOptimizer(0.1).minimize(loss) init=tf.global_variables_initializer() sess=tf.Session() sess.run(init) for i in range(100): sess.run(train_step,feed_dict={xs: x_data,ys: y_data}) if i%5==0: print(sess.run(loss,feed_dict={xs:x_data,ys:y_data}))
輸出結果:
0.256632
0.0532672
0.0364148
0.0264385
0.0202409
0.0164314
0.0141813
0.0129079
0.0121878
0.0117478
0.0114399
0.0111906
0.0109715
0.0107702
0.0105785
0.010393
0.0102144
0.0100426
0.00987562
0.00971407
這里舉例 用過dropout后,loss變得更大,是因為我這里所用數據較少,用更多的訓練集去測試,dropout會變現的很好!