这里我的想法就是先写一个回调函数读取每个batch中loss,然后读取History中存储的数值
这个方法很大众,不管可以读取loss,History中所有值都可以

每个batch记录损失函数(loss)

class Mylosscallback(Callback):
def __init__(self, log_dir):
super(Callback, self).__init__()
self.val_writer = tf.summary.FileWriter(log_dir)
self.num=0
def on_train_begin(self, logs={}):
self.losses = []

def on_batch_end(self, batch, logs={}):
self.num=self.num+1
val_loss=logs.get('loss')
# print(1111)
val_loss_summary = tf.Summary()
val_loss_summary_value = val_loss_summary.value.add()
val_loss_summary_value.simple_value = val_loss
val_loss_summary_value.tag = 'loss'
self.val_writer.add_summary(val_loss_summary, self.num)
self.val_writer.flush()

callbacks=[Mylosscallback(log_dir=’./tmp/log’)]

tensorboard 训练过工程可视化

​​tensorboard 查看训练过程​​

回调函数

keras.callbacks.Callback()

  • log_dir: 用来保存被 TensorBoard 分析的日志文件的文件名。
  • histogram_freq: 对于模型中各个层计算激活值和模型权重直方图的频率(训练轮数中)。 如果设置成 0 ,直方图不会被计算。对于直方图可视化的验证数据(或分离数据)一定要明确的指出。
  • write_graph: 是否在 TensorBoard 中可视化图像。 如果 write_graph 被设置为 True。
  • write_grads: 是否在 TensorBoard 中可视化梯度值直方图。 histogram_freq 必须要大于 0 。
  • batch_size: 用以直方图计算的传入神经元网络输入批的大小。
  • write_images: 是否在 TensorBoard 中将模型权重以图片可视化,如果设置为True,日志文件会变得非常大。
  • embeddings_freq: 被选中的嵌入层会被保存的频率(在训练轮中)。
  • embeddings_layer_names: 一个列表,会被监测层的名字。 如果是 None 或空列表,那么所有的嵌入层都会被监测。
  • embeddings_metadata: 一个字典,对应层的名字到保存有这个嵌入层元数据文件的名字。 查看 详情 关于元数据的数据格式。 以防同样的元数据被用于所用的嵌入层,字符串可以被传入。
  • embeddings_data: 要嵌入在 embeddings_layer_names 指定的层的数据。 Numpy 数组(如果模型有单个输入)或 Numpy 数组列表(如果模型有多个输入)。 Learn ore about embeddings。
  • update_freq: ‘batch’ 或 ‘epoch’ 或 整数。当使用 ‘batch’ 时,在每个 batch 之后将损失和评估值写入到 TensorBoard 中。同样的情况应用到 ‘epoch’ 中。如果使用整数,例如 10000,这个回调会在每 10000 个样本之后将损失和评估值写入到 TensorBoard 中。注意,频繁地写入到 TensorBoard 会减缓你的训练。

编写自己的回调函数

on_epoch_begin # 在每轮开始时被调用
on_epoch_end # 在每轮结束时被调用

on_batch_begin # 在处理每个批量之前被调用
on_batch_end # 在处理每个批量之后被调用

on_train_begin # 在训练开始时被调用
on_train_end # 在训练结束时被调用

例子:在每轮结束后将模型每层激活保存到硬盘(格式为Numpy数组),这个激活是对验证集的第一个样本计算得到的

import keras
import numpy as np

class ActivationLogger(keras.callbacks.Callback):
def set_model(self, model):
self.model = model # 在训练之前由父模型调用,告诉回调函数是哪个模型在调用它
layer_outputs = [layer.output for layer in model.layers]
self.activations_model = keras.models.Model(model.input,layer_outputs)
# 模型实例,返回每层的激活
def on_epoch_end(self, epoch, logs = None):
if self.validation_data is None:
raise RuntimeError('Requires validation_data')
validation_sample = self.validation_data[0][0:1] # 获取验证数据的第一个输入样本
activation = self.activations_model.predict(validation_sample)
f = open('activation_at_epoch_' + str(epoch) + '.npz', 'w') # 将数据保存到硬盘
np.savez(f, activations)
f.close()

一点点小思考

其实不一定非要输出batch size用来更新参数,用时间也是一样的
利用时间记录模型

import time
model_id = np.int64(time.strftime('%Y%m%d%H%M', time.localtime(time.time())))
model.save('./VGG16'+str(model_id)+'.h5')

获取history中的东西

​​keras中的History对象​​