将模式识别项目迁移至NAIE(一)-模型训练

NAIE模型训练服务

NAIE工作流程

  1. 导入数据集
  2. 创建模型训练
    • 创建开发环境并等待开发环境创建完成。
  3. 进入创建好的开发环境,见图1
  4. 安装所需库
    • 打开requirements.txt,加入所需库。
    • 如,需要使用sklearn库,且不指定版本,则直接加入一行 sklearn 即可。
    • 见下方标题-requirements.txt
  5. 引入代码
    • 复制粘贴,或者左上角添加文件。
    • 名称无要求,后面可以自己选执行文件。
    • 它自带了一个 模型训练名称.py 的文件(此处为example_name.py),提供了大致框架,可以直接将自己的代码复制进这里,或者留着它用作参考。
  6. 代码修改
    1. 数据集路径修改。
    2. 训练日志生成。
      • 具体修改见标题-代码修改
  7. 训练模型
    • 修改好代码后,点击训练模型,选择好主入口及AI引擎后即可开始训练,见图2。
    • 点击训练任务,训练完成后,可以查看运行日志及训练报告,见图3。
  8. 模型验证
图1:开发环境界面
图2:训练任务配置
图3:训练报告

代码修改

  • 数据集路径修改:
    • 原来的数据集路径用的是本地路径,这里需要调用NAIE里的get_data_reference来获取其在服务器的路径,来代替之前读取数据集的路径。
    • 代码:
      • from naie.datasets import get_data_reference
      • data_path = get_data_reference(dataset="数据集所在文件夹名称", dataset_entity="数据集文件名")[0]
    • 注:get_data_reference函数返回的是列表,所以要取[0]
  • 训练日志生成:
    • 也可以不用,直接print输出也行,但我纠结这个纠结挺久的,所以还是得讲讲。
    • 这里是模板里面的score_model()函数。
    • 一次的report(True)可以用多行的log_property()来添加日志,但如果再次调用report(True)就会覆盖掉上次的日志。
    • 所以代码里的日志我是在report(True)里面循环添加日志,而不是在外面。
    • 代码:
      • from __future__ import print_function # do not delete this line if you want to save your log file.这个引入是模板自带的,不是日志函数要求的,但因为它注释说是和log有关的,所以加在这里
      • from naie.metrics import report
      • with report(True) as log_report:
        • log_report.log_property("效果名称", accuracy_score(y_validation, model.predict(x_validation)))
    • 注:accuracy_score(y_validation, model.predict(x_validation))是返回模型预测效果的,我只试过返回浮点数的,没试过其他类型。

main.py

# -*- coding: utf-8 -*-
from __future__ import print_function  # do not delete this line if you want to save your log file.

import numpy as np
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA, QuadraticDiscriminantAnalysis as QDA
from naie.datasets import get_data_reference
from naie.metrics import report

'''
    代码框架见QDA.py,大致是 加载数据,模型训练,测试集预测,日志上传四个部分。
    这里补上了日志上传的代码,即score_model()
'''


def get_list_letter(char, features, path):
    #数据集处理部分
    with open(path, 'r') as letter_train:
        content_letter_train = letter_train.readlines()
    for line in content_letter_train:
        temp = line.split(',')
        temp[-1] = list(temp[-1])[0]
        char.append(temp[0])
        features.append((temp[1::]))
        
        
def convert_int(str_list):
    #数据集处理部分
    for row in range(0, len(str_list)):
        for col in range(0, len(str_list[row])):
            str_list[row][col] = int(str_list[row][col])


def convert_float(str_list):
    #数据集处理部分
    for row in range(0, len(str_list)):
        for col in range(0, len(str_list[row])):
            str_list[row][col] = float(str_list[row][col])


def train_and_test(train_result, fetures_list, test_list, analysis_method):
    #调用sklearn进行训练及预测
    letter_x = np.array(fetures_list)
    letter_y = np.array(train_result)
    if analysis_method == "LDA":
        clf = LDA()
    elif analysis_method == "QDA":
        clf = QDA()
    else:
        print("错误的分类方法名。")
        return -1
    clf.fit(letter_x, letter_y)
    return list(clf.predict(test_list))


def analysis_accuracy(judge_result, test_char):
    #分析预测精确度
    sum = 0
    right_num = 0
    for pos in range(0, len(judge_result)):
        sum += 1
        if judge_result[pos] == test_char[pos]:
            right_num += 1
    return right_num / sum


def score_model(method_list, accuracy_list):
            #    !!日志生成函数
    #NAIE官方模板,用于给出报告,下面的注释就是示例。
    score = {}
    for i in range(0, len(method_list)):
        score[method_list[i]] = accuracy_list[i]
    
    with report(True) as log_report:
        for method, score in score.items():
            log_report.log_property(method, score)
        
    """
    ====================== YOUR CODE HERE ======================
    there are several api you can use here.
    Example:
    from naie.metrics import report
    with report(True) as log_report:
        log_report.log_property("score", accuracy_score(y_validation, model.predict(x_validation)))
    ============================================================
    """
    return score


def main():
    
    # letter数据集初始化
            #    !!这里的路径获取改了
    letter_train_path = get_data_reference(dataset="Default", dataset_entity="letter_train").get_files_paths()[0]
    letter_train_class = []
    letter_train_features = []
    letter_test_path = get_data_reference(dataset="Default", dataset_entity="letter_test").get_files_paths()[0]
    #下面注释掉的是用来测试数据集如何导入的。
    # print()
    # print(type(letter_train_path))
    # print()
    # print(letter_train_path)
    # print()
    letter_test_class = []
    letter_test_features = []
    get_list_letter(letter_train_class, letter_train_features, letter_train_path)
    get_list_letter(letter_test_class, letter_test_features, letter_test_path)
    convert_int(letter_train_features)
    convert_int(letter_test_features)
    # Letter数据集学习
    letter_LDA_judge_result = train_and_test(letter_train_class, letter_train_features, letter_test_features, "LDA")
    letter_LDA_judge_accuracy = analysis_accuracy(letter_LDA_judge_result, letter_test_class)
    print('使用LDA对letter的', len(letter_train_features), '份数据学习后,对',
        len(letter_test_features), '份测试数据分类的准确率为:', letter_LDA_judge_accuracy)
    letter_QDA_judge_result = train_and_test(letter_train_class, letter_train_features, letter_test_features, "QDA")
    letter_QDA_judge_accuracy = analysis_accuracy(letter_QDA_judge_result, letter_test_class)
    print('使用QDA对letter的', len(letter_train_features), '份数据学习后,对',
        len(letter_test_features), '份测试数据分类的准确率为:', letter_QDA_judge_accuracy)
    
        #    !!增加了日志生成
    method_list = ['LDA', 'QDA']
    score_list = [letter_LDA_judge_accuracy, letter_QDA_judge_accuracy]
    score = score_model(method_list, score_list)
    
    return score


if __name__ == "__main__":
    main()

requirements.txt

#name [condition] [version]
#condition    ==, >=, <=, >, <
#tensorflow==1.8.1
naie
scikit-learn
numpy

You may also like...

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注