还是在之前的数据集上进行训练,下面是预处理和训练代码,在我之前的博客中已经有对代码的解释。
import tensorflow as tf
import os
import datetime
(train_image, train_labels), (test_image, test_labels) = tf.keras.datasets.mnist.load_data()
train_image = tf.expand_dims(train_image, -1)
test_image = tf.expand_dims(test_image, -1)
#将train_image中的每个元素转换为float类型,同时进行归一化
train_image = tf.cast(train_image/255, tf.float32)
test_image = tf.cast(test_image/255, tf.float32)
train_labels = tf.cast(train_labels, tf.int64)
test_labels = tf.cast(test_labels, tf.int64)
dataset = tf.data.Dataset.from_tensor_slices((train_image, train_labels))
test_dataset = tf.data.Dataset.from_tensor_slices((test_image, test_labels))
dataset = dataset.repeat().shuffle(60000).batch(128)
test_dataset = test_dataset.repeat().batch(128)
model = tf.keras.Sequential([
tf.keras.layers.Conv2D(16, [3,3], activation='relu', input_shape=(None, None, 1)), #input_shape=(None, None, 1)表示channel为1的任意大小的图片均可作为输入
tf.keras.layers.Conv2D(32, [3,3], activation='relu'),
tf.keras.layers.GlobalMaxPooling2D(),
tf.keras.layers.Dense(10, activation='softmax')
])
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy']
)
以上是创建model和设置model编译参数的代码,下面进入正题,开始tensorboard可视化。
我所理解的tensorboard可视化的内容,就是能够以可视化的形式查看训练时的中间参数。训练时的中间参数是写到磁盘上的,因此需要创建目录,创建目录的代码如下:
log_dir1 = os.path.join('logs', datetime.datetime.now().strftime('%Y%m%d-%H%M%S'))
下面创建回调函数,回调函数的作用就是能将训练时的中间值写入到之前的目录中。tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir=log_dir1)
注意的是,目录中有默认的两个子目录,分别为train和validation,即在训练的时候会将中间参数(如loss、acc等)写入这两个目录中,以便在tesorboard可视化界面中显示。那么,我能否自己创建其他的子目录呢,因为我还需要根据自己的需求显示其他的中间变量,答案是肯定的。
我现在需要将学习率设置动态变化的,即刚开始学习率较大,随着迭代次数(epoch)的增加,学习率减小,这样的目的是使得训练结果快速收敛,以节省训练花费时间。下面代码是创建1个动态改变学习率的函数。
#改变学习速率。越接近极值点时,学习速率越小,从而保证防止越过极值点
def lr_sche(epoch):
learning_rate = 0.030
if(epoch > 2):
learning_rate = 0.01#0.005
with file_writer.as_default():
tf.summary.scalar('learning_rate', data = learning_rate, step=epoch)
return learning_rate
下面代码将该函数加入到回调中:
lr_callback = tf.keras.callbacks.LearningRateScheduler(lr_sche)
下面是进行训练的代码:
model.fit(dataset,
epochs=25,
steps_per_epoch=60000//128,
validation_data=test_dataset,
validation_steps=10000//128,
callbacks=[tensorboard_callback, lr_callback]
)
注意的的是,上面加入了callbacks=[tensorboard_callback, lr_callback],才使得在训练中能够执行这两个回调函数。下面是训练的部分界面:
最后,如何通过tensorboard可视化进行查看呢。这样,输入以下代码
%load_ext tensorboard
%matplotlib inline
%tensorboard --logdir="./logs"
即显示出界面,在该界面中查看,部分界面如下: