当使用Tensorflow训练大量深层的神经网络时,我们希望去跟踪神经网络的整个训练过程中的信息,比如迭代的过程中每一层参数是如何变化与分布的,比如每次循环参数更新后模型在测试集与训练集上的准确率是如何的,比如损失值的变化情况。
这些都能在Tensorflow官方推出的可视化工具Tensorboard上实现,它可以将模型训练过程中的各种数据汇总起来存在我们自定义的路径你与日志文件中,然后在指定的web端可视化地展现这些信息。
下面,我们来简要介绍如何在深度学习的训练中保存并在tensorboard查看各项参数。
keras是TensorFlow的高阶API,封装了许多有用的函数以及网络训练方法(这里我用的是TensorFlow2.4的版本,之前刚经过大佬教诲学习tensorflow2就是学习keras),它使得我们建立模型以及训练十分简单,
这里我简单演示,就直接跳过前面导入数据以及建立模型了,我直接贴代码就好了
import datetime
import tensorflow as tf
from tensorflow import keras
(x_train,y_train),(x_test,y_test)=keras.datasets.mnist.load_data()
x_train=tf.expand_dims(x_train,-1)
x_test=tf.expand_dims(x_test,-1)
x_train=tf.cast(x_train/255,tf.float32)
x_test=tf.cast(x_test/255,tf.float32)
y_train=tf.cast(y_train,tf.int64)
y_test=tf.cast(y_test,tf.int64)
train_data=tf.data.Dataset.from_tensor_slices((x_train,y_train))
train_data=train_data.repeat().shuffle(60000).batch(128)#使用keras.fit的话需要显示调用repeat
#但自定义循环的话不需要repeat
test_data=tf.data.Dataset.from_tensor_slices((x_test,y_test))
test_data=test_data.repeat().batch(128)
model=keras.Sequential()
model.add(keras.layers.Conv2D(32,(3,3),input_shape=(28,28,1),activation='relu'))
model.add(keras.layers.Conv2D(32,(3,3),activation='relu'))
model.add(keras.layers.GlobalMaxPool2D())
model.add(keras.layers.Dense(10,activation='softmax'))
model.compile(optimizer='adam',
loss=keras.losses.SparseCategoricalCrossentropy(),
metrics=['accuracy'])
tensorboard是通过查看一个时间文件来浏览各项参数,所以接下来我们就需要建立事件文件的存储地址
import os
#确定事件文件地址
log_dir=os.path.join('logs',datetime.datetime.now().strftime("%Y%m%d-%H%M%S"))
#我们以当前时间来区分每次的训练文件
调用tensorboard的callback方法:
tensorBoard_CallBack=tf.keras.callbacks.TensorBoard(log_dir=log_dir,histogram_freq=1)
#log_dir为文件存储地址,hostogram_freq为记录频次
#然后我们在fit方法调用就好了
model.fit(train_data,epochs=25,steps_per_epoch=60000//128,validation_data=test_data,validation_steps=10000//128,callbacks=[tensorBoard_CallBack])
最后我们就看到事件文件存储在了我们当前地址
那么如何查看呢,我们在当前文件目录的上级目录logs中的终端里输入
tensorboard --logdir logs
然后出现以下就可以了,我们在浏览器中输入localhost:6006,就可以查看了
在这里我们可以查看accuracy,loss的变化情况,还可以查看网络的结构,连续点击还可以查看神经网络的层如何去实现,还可以查看训练的各项参数的变化范围
刚才讲的是如何在keras提供的fit方法中,保留参数以供参考,那么我们如果是在自己定义的方法怎么办呢,其实这里,我们只需要创建一个文件编写器然后每次编写的时候记录一下,就可以了
log_dir=os.path.join('./',datetime.datetime.now().strftime("%Y%m%d-%H%M%S"))
train_log_dir=log_dir+'/train'
test_log_dir=log_dir+'/test'
train_writer=tf.summary.create_file_writer(train_log_dir)
test_writer=tf.summary.create_file_writer(test_log_dir)
在上面我们利用tensorflow的打算保留训练数据和测试数据,那么我们在训练函数中填写成这样就可以了
def train():
for epoch in range(10):
for (batch, (images, labels)) in enumerate(dataset):
train_step(model, images, labels)
print('Epoch{} loss is {}, accuracy is {}'.format(epoch,
train_loss.result(),
train_accuracy.result()))
with train_writer.as_default():
tf.summary.scalar('loss',train_loss.result(),step=epoch)#收集标量值
tf.summary.scalar('accuracy',train_accuracy.result(),step=epoch)
for (batch, (images, labels)) in enumerate(test_dataset):
test_step(model, images, labels)
print('Epoch {} test_loss is {}, test_accuracy is {}'.format(epoch,
test_loss.result(),
test_accuracy.result()))
with test_writer.as_default():
tf.summary.scalar('loss', test_loss.result(), step=epoch)
tf.summary.scalar('accuracy', test_accuracy.result(), step=epoch)
train_loss.reset_states()#重新设置训练参数的状态
train_accuracy.reset_states()
test_loss.reset_states()
test_accuracy.reset_states()
这样我们就可以查看在自定义循环下我们保存的数据变化(在这里我们保存了每一步的accuracy和loss),接下来我们查看一下
在本节中我们介绍了如何在训练深度学习模型中,保存事件文件从而被tensorboard读取可视化展示,从而有利于我们去分析神经网络训练的各项问题,从而去调整整个模型。
如果本篇对你有用,麻烦点个赞,或者本文哪里有错误或者有什么疑问的可以在评论区里交流,谢谢。