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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章