TensorFlow1.x入門(7)——Dropout與優化器

系列文章

1. 計算圖的創建與啓動

2. 變量的定義及其操作

3. Feed與Fetch

4. 線性迴歸

5. 構建非線性迴歸模型

6. 簡單分類問題

引言

dropout技術是經常用於神經網絡防止過擬合的方法,具體的原理以及內容之前的博客有講。here

優化器則是深度神經網絡在訓練過程的核心,通過優化器在迭代數據的過程中不斷的更新網絡的參數值,使得模型的loss下降並且收斂在一個較低的值。不同的優化器採取的優化策略各不相同。

知識點

當使用dropout時,需要設置一個參數keep_prob。也就是神經元保留的參數。這個參數的取值爲[0.0, 1.0],可以取到邊界。當然這個參數值,可以用placeholder()來定義並動態的傳入。由於是一個數值,所以沒有必要定義它的大小(shape),只需要將dtype設置爲tf.float32。

tf.nn.dropout()是添加dropout的api。需要傳入2個參數,一個是某一層的輸出,也就是在哪層用dropout;第二個是keep_prob是神經元保留的概率。

tf.train.AdamOptimizer()可以定義Adam作爲網絡的優化器,而其他的優化器也可以在tf.train中找到。

示例

#%% md
# Dropout與優化器
#%% md
Dropout類似於bagging的思想,用來防止模型的過擬合現象,不同的優化器對模型收斂的影響不同
#%%
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
#%%
mnist = input_data.read_data_sets("MNIST",one_hot=True)
#%%
batch_size = 50
n_batchs = mnist.train.num_examples // batch_size
#%%
n_batchs
#%% md
## 定義輸入層

兩個數據的placeholder,一個dropout的參數
#%%
x = tf.placeholder(shape=[None, 784], dtype=tf.float32)
y = tf.placeholder(shape=[None, 10], dtype=tf.float32)
keep_prob = tf.placeholder(tf.float32)
#%%
x,y,keep_prob
#%% md
## 定義隱藏層
#%%
w1 = tf.Variable(tf.zeros([784,1024]))
a1 = tf.nn.sigmoid(tf.matmul(x,w1))
o1 = tf.nn.dropout(a1,keep_prob)
#%%
w1,a1,o1
#%%
w2 = tf.Variable(tf.zeros([1024,512]))
a2 = tf.nn.sigmoid(tf.matmul(o1,w2))
o2 = tf.nn.dropout(a2,keep_prob)
#%%
w2,a2,o2
#%%
w3 = tf.Variable(tf.zeros([512,128]))
a3 = tf.nn.sigmoid(tf.matmul(o2,w3))
o3 = tf.nn.dropout(a3,keep_prob)
#%%
w3,a3,o3
#%% md
## 定義輸出層
#%%
w4 = tf.Variable(tf.zeros([128, 10]))
prediction = tf.nn.softmax(tf.matmul(o3,w4))
#%%
w4, prediction
#%% md
## 定義損失函數和優化器
#%%
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=prediction, labels=y))
train_step = tf.train.AdamOptimizer(0.001).minimize(loss)
#%% md
## 計算正確率
#%%
correct_prediction = tf.equal(tf.argmax(prediction, 1), tf.argmax(y, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
#%%
correct_prediction, accuracy
#%% md
## 初始化變量
#%%
import os

os.environ["CUDA_VISIBLE_DEVICES"] = "-1"
#%%
init = tf.global_variables_initializer()
#%%
with tf.Session() as sess:
    sess.run(init)
    for epoch in range(50):
        for batch in range(n_batchs):
            batch_x, batch_y = mnist.train.next_batch(batch_size)
            sess.run([train_step], feed_dict={x:batch_x, y:batch_y, keep_prob:0.5})
        acc, loss_value = sess.run([accuracy, loss], feed_dict= {x:mnist.test.images, y: mnist.test.labels, keep_prob:1.0})
        print("Iter: ", epoch, "Loss: ", loss_value, "Accuracy: ", acc)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章