TensorFlow1.x入门(7)——Dropout与优化器

系列文章

本教程有同步的github地址

0. 统领篇

1. 计算图的创建与启动

2. 变量的定义及其操作

3. Feed与Fetch

4. 线性回归

5. 构建非线性回归模型

6. 简单分类问题

7. Dropout与优化器

8. 手动调整学习率与TensorBoard

9. 卷积神经网络(CNN)

10. 循环神经网络(RNN)

11. 模型的保存与恢复

Dropout与优化器

引言

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)

猜你喜欢

转载自blog.csdn.net/qq_19672707/article/details/105589932
今日推荐