python深度学习--检查和监控模型(使用Keras回调函数和TensorBoard)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SunChao3555/article/details/88821249
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import pylab
from pandas import DataFrame, Series
from keras import models, layers, optimizers, losses, metrics
from keras.utils.np_utils import to_categorical

plt.rcParams['font.sans-serif'] = ['SimHei']  #指定默认字体
plt.rcParams['axes.unicode_minus'] = False  #解决保存图像是负号'-'显示为方块的问题

#使用Keras回调函数和TensorBoard 来检查并监控深度学习模型

'''
使用 model.fit()或 model.fit_generator() 在一个大型数据集上启动数十轮的训练,你只能在开始时控制它的状态,那么在训练过程中如何更好地访问并控制模型内部过程呢?
'''
#训练过程中将回调函数作用于模型
'''
    前面所有例子都采用这样一种策略:训练足够多的轮次,这时模型已经开始过拟合,根据这第一次运行来确定训练所需要的正确轮数,然后使用这个最佳轮数从头开始再启动一次新的训练。当然,这种方法很浪费
    处理这个问题的更好方法是,当观测到验证损失不再改善时就停止训练。这可以使用 Keras 回调函数来实现.
    
回调函数的一些用法示例如下所示。
    模型检查点(model checkpointing):在训练过程中的不同时间点保存模型的当前权重。
    提前终止(early stopping):如果验证损失不再改善,则中断训练(当然,同时保存在训练过程中得到的最佳模型)。
    在训练过程中动态调节某些参数值:比如优化器的学习率。
    在训练过程中记录训练指标和验证指标,或将模型学到的表示可视化(这些表示也在不断更新):你熟悉的 Keras 进度条就是一个回调函数!
    keras.callbacks.ModelCheckpoint 
    keras.callbacks.EarlyStopping 
    keras.callbacks.LearningRateScheduler 
    keras.callbacks.ReduceLROnPlateau 
    keras.callbacks.CSVLogger
'''
#ModelCheckpoint 与 EarlyStopping 回调函数

from keras import callbacks
'''
callbacks_list=[
    callbacks.EarlyStopping(#如果不再改善,就中断训练
        monitor='acc',#监控模型的精度
        patience=1,#如果模型在多于一轮的时间(即两轮)内不再改善,中断训练
    ),
    callbacks.ModelCheckpoint(#在每轮过后保存当前权重
        filepath='my_model.h5',#目标模型文件保存路径
        monitor='val_loss',#如果验证损失没有改善,
        save_best_only=True#那么不需要覆盖模型文件,即保存在训练过程中见到的最佳模型
    )
]
x=...
y=...
x_val=...
y_val=...
model=...
model.compile(optimizer='rmsprop',loss='binary_crossentropy',metrics=['acc'])#你监控精度,所以它应该是模型指标的一部分
model.fit(x,y,
          epochs=10,
          batch_size=32,
          callbacks=callbacks_list,
          validation_data=(x_val,y_val))
#注意,由于回调函数要监控验证损失和验证精度,所以在调用 fit 时需要传入 validation_data(验证数据)
'''
#ReduceLROnPlateau回调函数----在损失平台降低学习率
#如果验证损失不再改善,你可以使用这个回调函数来降低学习率。在训练过程中如果出现了损失平台(loss plateau),那么增大或减小学习率都是跳出局部最小值的有效策略

callbacks_list=[
    callbacks.ReduceLROnPlateau(
        monitor='val_loss',
        factor=0.1,#触发时将学习率除以10
        patience=10,#如果验证损失在10轮内都没有改善,那么就触发该回调函数
    )
]

#自定义回调函数
'''
#回调函数的实现方式是创建 keras.callbacks.Callback 类的子类。
    然后你可以实现下面这些方法(顾名思义),它们分别在训练过程中的不同时间点被调用。
    on_epoch_begin ,on_epoch_end,on_batch_begin ,on_batch_end,on_train_begin ,on_train_end
    这些方法被调用时都有一个logs参数,这个参数是一个字典,里面包含前一个批量、前一个轮次或前一次训练的信息,即训练指标和验证指标等。此外,回调函数还可以访问下列属性。
    self.model:调用回调函数的模型实例。
    self.validation_data:传入 fit 作为验证数据的值。
'''
#示例
class ActivationLogger(callbacks.Callback):
    def set_model(self, model):
        self.model=model#在训练之前由父模型调用,告诉回调函数是哪个模型在调用它
        layer_outputs=[layer.output for layer in model.layers ]
        self.activations_model=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]#获取第一个验证样本
        activations=self.activations_model.predict(validation_sample)
        f=open('activations_at_epoch_'+ str(epoch) + '.npz','w')#保存numpy数组
        np.savez(f,activations)
        f.close()

#TensorBoard 简介:TensorFlow 的可视化框架
'''
TensorBoard 的主要用途是,在训练过程中帮助你以可视化的方法监控模型内部发生的一切。 如果你监控了除模型最终损失之外的更多信息,那么可以更清楚地了解模型做了什么、没做什么,并且能够更快地取得进展
        在训练过程中以可视化的方式监控指标 #SCARLAS
        将模型架构可视化 #GRAPHS
        将激活和梯度的直方图可视化 #直方图中是每层的激活值
        以三维的形式研究嵌入  #PROJECTOR中,默认使用PCA降至三维
'''
#在 IMDB 情感分析任务上训练一个一维卷积神经网络。
# from keras import models
from keras.datasets import imdb
from keras.preprocessing import sequence

max_features=20000
max_len=500

(x_train, y_train), (x_test, y_test) = imdb.load_data(num_words=max_features)
x_train = sequence.pad_sequences(x_train, maxlen=max_len)
x_test = sequence.pad_sequences(x_test, maxlen=max_len)
model = models.Sequential()
model.add(layers.Embedding(max_features, 128, input_length=max_len, name='embed'))
model.add(layers.Conv1D(32, 7, activation='relu'))
model.add(layers.MaxPooling1D(5))
model.add(layers.Conv1D(32, 7, activation='relu'))
model.add(layers.GlobalMaxPooling1D())
model.add(layers.Dense(1))
model.summary()
model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['acc'])

#在开始使用 TensorBoard 之前,我们需要创建一个目录,用于保存它生成的日志文件

# #使用一个 TensorBoard 回调函数来训练模型
callbacks=[
    callbacks.TensorBoard(
        log_dir='my_log_dir',#日志文件将被写入这个位置
        histogram_freq=1,#每一轮之后记录激活直方图
        embeddings_freq=1,#每一轮之后记录嵌入数据
        embeddings_data=x_train[:500].astype('float32')#[:500]若过大会导致W tensorflow/core/framework/allocator.cc:122]

    )
]
history = model.fit(
    x_train,
    y_train,
    epochs=20,
    batch_size=128,
    validation_split=0.2,
    callbacks=callbacks)

#打开当前python环境命令行,输入tensorboard --logdir=F:/PythonFiles/DeepLearning/my_log_dir  执行,然后可在http://localhost:6006 查看

#Keras 还提供了另一种更简洁的方法——keras.utils.plot_model函数,它可以将模型绘制为层组成的图,而不是 TensorFlow运算组成的图。使用这个函数需要安装 Python 的 pydot 库和pydot-ng库,还需要安装graphviz库

'''
windows安装graphviz步骤:
1.pip install pydot
2.pip install pydot-ng
3.pip install graphviz
4.下载graphviz  
    https://graphviz.gitlab.io/_pages/Download/Download_windows.html
    .msi即可
    安装完成后,将graphviz的bin目录 路径添加到系统环境变量Path中:
    比如我的路径为
        G:\ppackage\graphviz\bin
5.然后,进入python安装目录下的site-packages-->pydot.py,
    找到 class Dot-->def __init__(self, *argsl, **argsd)-->self.prog
    将self.prog = 'dot' 修改为  self.prog = 'dot.exe'
# pydot-ng-->__init__.py --> path = r"G:\ppackage\graphviz\bin"   
'''
from keras.utils import plot_model
plot_model(model,
           show_shapes=True,# 在层组成的图中显示形状信息,默认False
           to_file='model.png',
           )

猜你喜欢

转载自blog.csdn.net/SunChao3555/article/details/88821249