概述
这里我的想法就是先写一个回调函数读取每个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对象
最后
以上就是壮观毛豆为你收集整理的keras 按batch size读取loss一点点小思考获取history中的东西的全部内容,希望文章能够帮你解决keras 按batch size读取loss一点点小思考获取history中的东西所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复