其他
Keras的可视化训练
星标或者置顶【OpenCV学堂】
干货与教程第一时间送达!
配置与安装
使用graphviz来做模型的显示时候,必须首先安装它,下载地址如下:
https://graphviz.gitlab.io/_pages/Download/windows/graphviz-2.38.msi
下载以后,直接点击安装即可,最关键的是安装号之后,请把下面的路径
C:\Program Files (x86)\Graphviz2.38\bin
添加到系统的环境变量中去。然后再执行下面的安装命令行
pip install pydot
pip install graphviz
目的是添加python的调用支持!
模型结构与训练可视化
模型结构可视化
对于常见的各种模型结构,Keras通过applications都可以加载,如果想显示这些模型的结构,需要执行如下的代码:
# 显示模型结构
keras.utils.plot_model(model, to_file='D:/mlp.png')
训练过程可视化
Keras支持集成tensorboard支持实现对训练过程的可视化,只需要在训练的时候添加几行代码即可使用tensorboard来对Keras模型训练的可视化浏览:
tb_callback = keras.callbacks.TensorBoard(log_dir='D:/my_train/keras',
histogram_freq=0,
write_graph=True,
write_images=True)
history = model.fit(x=train_images, y=train_labels, epochs=5, callbacks=[tb_callback])
其中函数:
callback_tensorboard (
log_dir = "logs",
histogram_freq = 0,
write_graph = TRUE,
write_images = FALSE,
embeddings_freq = 0,
embeddings_layer_names = NULL,
embeddings_metadata = NULL
)
各个参数的解释如下:
log_dir 输出日志目录
histogram_freq计算各个层参数,0表示不激活计算
write_graph 是否显示图
write_images 是否用图像来显示各层权重
embeddings_freq 嵌入层保存,0表示不保存
embeddings_layer_names 嵌入层名称
embeddings_metadata 嵌入层元数据
可视化训练历史数据
在训练过程中的损失与精度, 通过获取返回的dict数据绘制精度与损失曲线如下:
print(history)
# 曲线绘制训练的准确率与精度
plt.plot(history.history['acc'])
plt.title('Model accuracy')
plt.ylabel('Accuracy')
plt.xlabel('Epoch')
plt.legend(['Train'], loc='upper left')
plt.show()
plt.plot(history.history['loss'])
plt.title('Model loss')
plt.ylabel('Loss')
plt.xlabel('Epoch')
plt.legend(['Train'], loc='upper left')
plt.show()
VIZ模型结构可视化:
Tensorboard可视化网络结构
网络训练精度与损失
从历史数据中生成的精度与损失plot
演示代码
上述完整的Keras可视化演示程序是基于mnist数据集实现简单的CNN模型,代码如下:
import tensorflow as tf
from tensorflow import keras
import matplotlib.pyplot as plt
import numpy as np
import cv2 as cv
def one_hot(labels):
onehot_labels = np.zeros(shape=[len(labels), 10])
for i in range(len(labels)):
index = labels[i]
onehot_labels[i][index] = 1
return onehot_labels
def vis_train_history():
# 加载mnist数据集
(train_images, train_labels), (test_images, test_labels) = keras.datasets.mnist.load_data()
print(train_labels[0])
plt.figure()
plt.imshow(train_images[0])
plt.colorbar()
plt.grid(False)
plt.show()
plt.figure(figsize=(10, 10))
# re-scale to 0~1.0之间
train_images = train_images / 255.0
test_images = test_images / 255.0
train_images = np.expand_dims(train_images, axis=3)
test_images = np.expand_dims(test_images, axis=3)
train_labels = one_hot(train_labels)
test_labels = one_hot(test_labels)
# 构建卷积神经网络
model = keras.Sequential()
model.add(keras.layers.Conv2D(filters=32, kernel_size=5, strides=(1, 1),
padding='same', activation=tf.nn.relu, input_shape=(28, 28, 1)))
model.add(keras.layers.MaxPool2D(pool_size=(2, 2), strides=(2, 2), padding='valid'))
model.add(keras.layers.Conv2D(filters=64, kernel_size=3, strides=(1, 1),
padding='same', activation=tf.nn.relu))
model.add(keras.layers.MaxPool2D(pool_size=(2, 2), strides=(2, 2), padding='valid'))
model.add(keras.layers.Dropout(0.25))
model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(units=128, activation=tf.nn.relu))
model.add(keras.layers.Dropout(0.5))
model.add(keras.layers.Dense(units=10, activation=tf.nn.softmax))
# 显示模型结构
keras.utils.plot_model(model, to_file='D:/my_cnn.png')
cv.namedWindow("vgg model", cv.WINDOW_AUTOSIZE)
image = cv.imread("D:/my_cnn.png")
cv.imshow("vgg model", image)
cv.waitKey(0)
cv.destroyAllWindows()
# 设置训练方法
model.compile(optimizer=tf.train.AdamOptimizer(),
loss="categorical_crossentropy", metrics=['accuracy'])
# 训练数据,tensor board 显示
tb_callback = keras.callbacks.TensorBoard(log_dir='D:/my_train/keras',
histogram_freq=1,
write_graph=True,
write_images=True)
history = model.fit(x=train_images, y=train_labels, epochs=5,
validation_data=(test_images, test_labels),
verbose=1, callbacks=[tb_callback])
print(history)
# 曲线绘制训练的准确率与精度
plt.plot(history.history['acc'])
plt.title('Model accuracy')
plt.ylabel('Accuracy')
plt.xlabel('Epoch')
plt.legend(['Train'], loc='upper left')
plt.show()
plt.plot(history.history['loss'])
plt.title('Model loss')
plt.ylabel('Loss')
plt.xlabel('Epoch')
plt.legend(['Train'], loc='upper left')
plt.show()
# 模型验证
test_loss, test_acc = model.evaluate(test_images, test_labels)
print("Test Accuracy %.4f" % test_acc)
if __name__ == "__main__":
vis_train_history()
其中中间层输出的结果在tensorboard的image标签可以看到!启动tensorboard的命令行如下:
往期精选
百舸争流,奋楫者先
千帆竟发,勇进者胜
【扫码关注我们】