版权声明:本文为博主原创文章,未经博主允许不得转载。 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',
)