• Keras入门(六)模型训练实时可视化


      在北京做某个项目的时候,客户要求能够对数据进行训练、预测,同时能导出模型,还有在页面上显示训练的进度。前面的几个要求都不难实现,但在页面上显示训练进度当时笔者并没有实现。
      本文将会分享如何在Keras中将模型训练的过程实时可视化。
      幸运的是,已经有人帮我们做好了这件事,这个项目名叫hualos,Github的访问网址为:https://github.com/fchollet/hualos, 作者为François Chollet和Eder Santana,前面的作者就是Keras的创造者,同时也是书籍《Deep Learning with Python》的作者。
      大神的工作大大地方便了我们的使用。调用该项目仅需要三行代码,示例如下:

    from keras import callbacks
    remote = callbacks.RemoteMonitor(root='http://localhost:9000')
    
    model.fit(X_train, Y_train, batch_size=batch_size, nb_epoch=nb_epoch, validation_data=(X_test, Y_test), callbacks=[remote])
    

      该项目使用Python2写的,用到的第三方模块为Flask, gevent,其中Flask为网页端框架,gevent用于并发。用到的JavaScript的第三方模块为D3.js和C3.js。该项目使用起来非常方便,只需要切换至hualos项目所在文件夹,然后python api.py即可。
      下面将介绍其使用方法,我们的项目结构如下:
    项目结构
    其中hualos可以从Github上直接clone下来,笔者对代码和HTML网页稍作了修改,便于自己使用。model_train.py为Keras模型训练脚本,iris.csv为著名的鸢尾花数据集。
      model_train.py中利用Keras搭建了简单的DNN模型对鸢尾花数据集进行训练及预测,该模型的介绍已经在文章Keras入门(一)搭建深度神经网络(DNN)解决多分类问题中给出,其完整代码如下:

    # 导入模块
    import numpy as np
    import keras as K
    import tensorflow as tf
    import pandas as pd
    from sklearn.model_selection import train_test_split
    from sklearn.preprocessing import LabelBinarizer
    from keras import callbacks
    
    
    # 读取CSV数据集,并拆分为训练集和测试集
    # 该函数的传入参数为CSV_FILE_PATH: csv文件路径
    def load_data(CSV_FILE_PATH):
        IRIS = pd.read_csv(CSV_FILE_PATH)
        target_var = 'class'  # 目标变量
        # 数据集的特征
        features = list(IRIS.columns)
        features.remove(target_var)
        # 目标变量的类别
        Class = IRIS[target_var].unique()
        # 目标变量的类别字典
        Class_dict = dict(zip(Class, range(len(Class))))
        # 增加一列target, 将目标变量进行编码
        IRIS['target'] = IRIS[target_var].apply(lambda x: Class_dict[x])
        # 对目标变量进行0-1编码(One-hot Encoding)
        lb = LabelBinarizer()
        lb.fit(list(Class_dict.values()))
        transformed_labels = lb.transform(IRIS['target'])
        y_bin_labels = []  # 对多分类进行0-1编码的变量
        for i in range(transformed_labels.shape[1]):
            y_bin_labels.append('y' + str(i))
            IRIS['y' + str(i)] = transformed_labels[:, i]
        # 将数据集分为训练集和测试集
        train_x, test_x, train_y, test_y = train_test_split(IRIS[features], IRIS[y_bin_labels], 
                                                            train_size=0.7, test_size=0.3, random_state=0)
        return train_x, test_x, train_y, test_y, Class_dict
    
    
    if __name__ == '__main__':
    
        # 0. 开始
        print("
    Iris dataset using Keras")
        np.random.seed(4)
        tf.set_random_seed(13)
    
        # 1. 读取CSV数据集
        print("Loading Iris data into memory")
        CSV_FILE_PATH = 'iris.csv'
        train_x, test_x, train_y, test_y, Class_dict = load_data(CSV_FILE_PATH)
    
        # 2. 定义模型
        init = K.initializers.glorot_uniform(seed=1)
        simple_adam = K.optimizers.Adam()
        model = K.models.Sequential()
        model.add(K.layers.Dense(units=5, input_dim=4, kernel_initializer=init, activation='relu'))
        model.add(K.layers.Dense(units=6, kernel_initializer=init, activation='relu'))
        model.add(K.layers.Dense(units=3, kernel_initializer=init, activation='softmax'))
        model.compile(loss='categorical_crossentropy', optimizer=simple_adam, metrics=['accuracy'])
    
        # 3. 训练模型
        b_size = 1
        max_epochs = 100
        print("Starting training ")
        remote = callbacks.RemoteMonitor(root='http://localhost:9000')
        h = model.fit(train_x, train_y, validation_data=(test_x, test_y), batch_size=b_size, epochs=max_epochs,
                      shuffle=True, verbose=1, callbacks=[remote])
        print("Training finished 
    ")
    
        # 4. 评估模型
        eval = model.evaluate(test_x, test_y, verbose=0)
        print("Evaluation on test data: loss = %0.6f accuracy = %0.2f%% 
    " 
              % (eval[0], eval[1] * 100) )
    
        # 5. 使用模型进行预测
        np.set_printoptions(precision=4)
        unknown = np.array([[6.1, 3.1, 5.1, 1.1]], dtype=np.float32)
        predicted = model.predict(unknown)
        print("Using model to predict species for features: ")
        print(unknown)
        print("
    Predicted softmax vector is: ")
        print(predicted)
        species_dict = {v:k for k,v in Class_dict.items()}
        print("
    Predicted species is: ")
        print(species_dict[np.argmax(predicted)])
    

      我们切换至hualos文件夹,运行python api.py,然后再用Python3运行model_train.py文件,在浏览器中输入网址:http://localhost:9000,即可看到在网页中显示的模型训练的实施可视化的结果,图像如下:

    因为这里无法给出视频,需要观看视频的读者可以移步网址:https://mp.weixin.qq.com/s?__biz=MzU2NTYyMDk5MQ==&mid=2247484522&idx=1&sn=dab46a55945baf2411e30bd109cee76f&chksm=fcb9bdfacbce34ec02f3e958988e9b400676d29f88c1efad5ce01fb1f4ce2f5f96ccf0e4af66&token=1377830530&lang=zh_CN#rd

      本项目的Github地址为:https://github.com/percent4/keras_train_visualization
      本期分享到此结束,感谢大家阅读~

  • 相关阅读:
    IEnumerable<T>转DataTable的几种方法
    关于IAsyncResult接口的CompletedSynchronously属性
    为WCF增加UDP绑定(储备篇)
    WPF自定义集合控件概述与遇到的问题
    WPF嵌套模板引发的血案
    为WCF增加UDP绑定(实践篇)
    Uva 10557 XYZZY(DFS+BFS)
    Uva 572 Oil Deposits(DFS)
    Uva 532 Dungeon Master(三维迷宫)
    Uva 10004 Bicoloring
  • 原文地址:https://www.cnblogs.com/jclian91/p/12358798.html
Copyright © 2020-2023  润新知