查看原文
其他

Keras的可视化训练

gloomyfish OpenCV学堂 2020-02-04

点击上方蓝字关注我们

星标或者置顶【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=(1010))

    # 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=(11),
                                  padding='same', activation=tf.nn.relu, input_shape=(28281)))
    model.add(keras.layers.MaxPool2D(pool_size=(22), strides=(22), padding='valid'))
    model.add(keras.layers.Conv2D(filters=64, kernel_size=3, strides=(11),
                                  padding='same', activation=tf.nn.relu))
    model.add(keras.layers.MaxPool2D(pool_size=(22), strides=(22), 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的命令行如下:


往期精选



百舸争流,奋楫者先

千帆竟发,勇进者胜


【扫码关注我们】

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存