TensorFlow1.x入门(8)——手动调整学习率与TensorBoard

系列文章

本教程有同步的github地址

0. 统领篇

1. 计算图的创建与启动

2. 变量的定义及其操作

3. Feed与Fetch

4. 线性回归

5. 构建非线性回归模型

6. 简单分类问题

7. Dropout与优化器

8. 手动调整学习率与TensorBoard

9. 卷积神经网络(CNN)

10. 循环神经网络(RNN)

11. 模型的保存与恢复

手动调整学习率与TensorBoard

前言

学习率的调整对模型的收敛较为重要,当学习率较大时,模型有可能会产生震荡甚至还会发生Loss跑飞的情况。所以随着迭代的进行,学习率的下降会有利于模型收敛到较好的水平。

TensorBoard是TensorFlow自带的画图工具,能够记录变量的变化情况。常常用来记录模型的Loss以及准确率的变化,同时也可以记录其他的模型参数以及变量的变化,需要手动添加所需记录的变量。

知识点

tf.name_scope()定义一个命名空间,不同命名空间中的参数的name可以一样,避免了命名混乱以及相互之间的污染。同时在TensorBoard中也可以更加直观的看到相关的曲线与图像,同时命名空间可以进行嵌套。

tf.sqrt()函数代表了开根号的操作。
tf.summary.scalar()传入两个参数,分别是name和相关的值。name代表图像在TensorBoard中的名称,值为图像上的点。这个函数可以依据迭代的进行二生成对应值的趋势图。
tf.summary.histogram()代表绘制直方图。

要绘制计算图中的变量及其变化,必须在计算途中将所有的变量融合到一起,做统一的记录,而不是分开做多次。所以采用如下的代码在计算图中进行融合。

	merged = tf.summary.merge_all()

同时TensorBoard可以记录计算图,在Session中写如下语句就可以实现,这样就会将计算图保存,并且也会保存要存的变量。

writer = tf.summary.FileWriter('logs/', sess.graph)

在迭代每个epoch时,需要将summary在sess中run一下,将其写入到上述的文件中。

summary, _ = sess.run([merged, train_step], feed_dict = {x:batch_x, y:batch_y, keep_prob:0.5})
writer.add_summary(summary, epoch * n_batchs + batch)

示例

#%% md
# 手动调整学习率并在TensorBoard中显示
#%%
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
#%% md
载入数据
#%%
mnist = input_data.read_data_sets("MNIST", one_hot=True)
#%%
mnist
#%%
batch_size = 100
n_batchs = mnist.train.num_examples // batch_size
#%% md
## 构建参数的概要函数
#%% md
针对模型的参数进行的统计
#%%
def variable_info(var):
    with tf.name_scope('summaries'):
        mean_value = tf.reduce_mean(var)
        tf.summary.scalar('mean', mean_value)
        with tf.name_scope('stddev'):
            stddev_value = tf.sqrt(tf.reduce_mean(tf.square(var - mean_value)))
        tf.summary.scalar('stddev', stddev_value)
        tf.summary.scalar('max', tf.reduce_max(var))
        tf.summary.scalar('min', tf.reduce_min(var))
        tf.summary.histogram('histogram',var)
#%% md
## 定义输入层
#%%
with tf.name_scope("input_layer"):
    x = tf.placeholder(tf.float32, [None, 784])
    y = tf.placeholder(tf.float32, [None, 10])
    keep_prob = tf.placeholder(tf.float32)
    lr = tf.Variable(0.01,tf.float32)
    tf.summary.scalar('learning_rate',lr)
#%% md
## 定义网络结构
#%%
with tf.name_scope('network'):
    with tf.name_scope("weights"):
        w = tf.Variable(tf.truncated_normal([784,10], stddev=0.1), name='w')
        variable_info(w)
    with tf.name_scope('baises'):
        b = tf.Variable(tf.zeros([10]) + 0.1, name="b")
        variable_info(b)
    with tf.name_scope('xw_plus_b'):
        a = tf.matmul(x,w) + b
    with tf.name_scope('softmax'):
        out = tf.nn.softmax(a)
#%% md
## 定义交叉熵损失函数与优化器
#%%
with tf.name_scope("loss_train"):
    loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=out, labels=y))
    train_step = tf.train.AdamOptimizer(lr).minimize(loss)
    tf.summary.scalar("loss", loss)
    
#%% md
##  定义评价模块
#%%
with tf.name_scope("eval"):
    with tf.name_scope("correct"):
        correct = tf.equal(tf.argmax(out, 1), tf.argmax(y, 1))
    with tf.name_scope("accuracy"):
        accuracy = tf.reduce_mean(tf.cast(correct, tf.float32))
        tf.summary.scalar('accuracy',accuracy)
#%% md
## 初始化变量和summary
#%%
init = tf.global_variables_initializer()
merged = tf.summary.merge_all()
#%% md
## 训练
#%%
with tf.Session() as sess:
    sess.run(init)
    writer = tf.summary.FileWriter('logs/', sess.graph)
    for epoch in range(200):
        sess.run(tf.assign(lr, 0.001 * (0.95 ** epoch)))
        for batch in range(n_batchs):
            batch_x, batch_y = mnist.train.next_batch(batch_size)
            summary, _ = sess.run([merged, train_step], feed_dict = {x:batch_x, y:batch_y, keep_prob:0.5})
            writer.add_summary(summary, epoch * n_batchs + batch)
        loss_value, acc, lr_value = sess.run([loss, accuracy, lr], feed_dict = {x:mnist.test.images, y:mnist.test.labels, keep_prob:1.0})
        print("Iter: ", epoch, "Loss: ", loss_value, "Acc: ", acc, "lr: ", lr_value)

猜你喜欢

转载自blog.csdn.net/qq_19672707/article/details/105596340