ML Configurator部署自己的模型|英飞凌Infineon

在这里插入图片描述

概要:承接上文ModusTool Box Machine Learning环境配置教程.本篇文章主要介绍如何从模型训练到.h5文件生成,最后到部署自己的模型.
获取最新的python代码,请访问我的github:https://github.com/Tereaslle/Heartbeat_Classification/tree/main

参考文档:

ModusToolbox™ Machine Learning user guide

ModusToolbox™ Machine Learning Configurator user guide

[用Keras从零开始6步骤训练神经网络](用Keras从零开始6步骤训练神经网络 - 知乎 (zhihu.com))

动手学深度学习(十二)——心跳信号分类预测(天池学习赛)简略

本篇文章仅供学习交流。如有侵权,请联系删除.

版本信息:
WIndows系统
Modustoolbox Version: 3.1.0.12257
ML configurator 2.0

Keras环境安装

keras和tensorflow版本对应关系

关键环境版本:

python=3.6

keras==2.3.1

tensorflow==2.0.0

使用anaconda创建虚拟环境

用到的命令行如下:

检查conda版本
conda --version

列出所有环境
conda env list

创建环境,指定python版本
conda create -n 虚拟环境名 python=3.9

删除环境
conda env remove --name 虚拟环境名

激活环境
conda activate 虚拟环境名

关闭环境
conda deactivate

导出虚拟环境
conda env export > ./文件名.yaml

导入虚拟环境
conda env create -f 文件名.yaml

检查虚拟环境是否生效(如果生效会显示虚拟环境的地址)
where python

使用以下命令创建conda虚拟环境:

conda create -n 你的虚拟环境名 python=3.6
conda activate 你的虚拟环境名
pip install tensorflow==2.0.0 keras==2.3.1 sklearn pandas -i https://pypi.tuna.tsinghua.edu.cn/simple

如果出现HTTP error的错误(如下图所示),请换源。【这步操作可以查其它博客,这里就不再赘述】
请添加图片描述

在创建好虚拟环境中使用activate env_name能切换好到事先创建好的环境
请添加图片描述
图中可以看到,已经从base环境切换到STAformer环境
接下来在pycharm中切换到该环境,打开Settings-> Project:项目名->Python Interpreter
请添加图片描述
在Show all中添加新的编译器的地址,一般地址是在C盘用户文件夹下的Anaconda文件夹中的envs文件夹下,具体可以看图。
在这里插入图片描述

pycharm中添加成功虚拟环境中后,你在pycharm中打开的terminal是自动切到对应环境,而不是默认的base环境
至此,虚拟环境配置完毕

数据处理

数据集下载

数据集各字段含义如下表

FieldDescription
id为心跳信号分配的唯一标识
heartbeat_signals心跳信号序列
label心跳信号类别(0、1、2、3)

文件结构:

在这里插入图片描述

其中必要的文件为:train_2.csv(由train.csv删除标题行得到),prepare.py,training.py

我们要做的就是实现一个神经网络模型对心跳信号进行分类,但在Modustoolbox中的.csv文件要求不能有字段名(即全都是值).而且我们希望将一组(205个)心跳信号分别视作特征 x i   i ∈ [ 0 , 204 ] x_i\ i\in[0,204] xi i[0,204],进行分类.因此需要对数据进行调整.

prepare.py 代码如下:

import pandas as pd

if __name__ == '__main__':
    # 加载原始数据没有标题行需要自己设置
    df_column_name = ['id', 'heartbeat_signals', 'label']
    # 加载原始数据
    df_train = pd.read_csv('./data/train_2.csv', header=None, names=df_column_name)
    # df_testA = pd.read_csv('./data/testA.csv', header=None, names=['id', 'heartbeat_signals'])
    column_name = ['id']
    # 生成0~204心跳信号字段名
    for i in range(205):
        column_name.append(i)
    column_name.append('label')
    # 生成空dataframe含字段名
    data = pd.DataFrame(columns=column_name)
    # 读取1000行源数据,可以自己调整,刚开始可以少一点,利于Debug
    for index in range(1000):
        series = df_train.iloc[index]   # 按列号获取数据,得到的是serious类型的变量
        series = series.values      # 取出List类型的值
        id = series[0]  # 第0列是id
        heartbeat_signal = series[1].split(',')     # 第1列是含有205个心跳信号的heartbeat_signal,类型是字符串,因此需要拆成单个变量,使用切片函数split
        heartbeat_signal = map(eval, heartbeat_signal)  # eval是一个函数根据字符串来计算结果,就是转为数字,map(eval,list)是将list内的所有元素作eval操作
        label = series[2]   # 第0列是label 标签
        # 重新拼接新的数据行
        t = []
        t.append(id)
        t.extend(heartbeat_signal)
        t.append(label)
        print(t)
        data.loc[index] = t
    '''
    path_or_buf : 文件路径,如果没有指定则将会直接返回字符串的 json
    sep : 输出文件的字段分隔符,默认为 “,”
    na_rep : 用于替换空数据的字符串,默认为''
    float_format : 设置浮点数的格式(几位小数点)
    columns : 要写的列
    header : 是否保存列名,默认为 True ,保存
    index : 是否保存索引,默认为 True ,保存
    index_label : 索引的列标签名
    '''
    # 修改dataframe的变量类型
    data = data.astype({'id': int,
                        'label': int})
    # print(type((data.loc[0])[0]))
    # 输出csv文件
    data.to_csv(path_or_buf='./data/prepared.csv', sep=',',header=False,index=False)

模型训练

代码如下:

from keras.models import Sequential
from keras.layers import Dense, Dropout, Conv1D, Activation
from keras.optimizers import SGD
import keras
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split

opt = keras.optimizers.rmsprop(learning_rate=0.0001, decay=1e-6)

if __name__ == '__main__':
    column_name = ['id']
    for i in range(205):
        column_name.append(i)
    column_name.append('label')
    df = pd.read_csv('./data/prepared.csv', header=None, names=column_name,sep=',')
    y = df[df.columns[-1]]
    X = df.drop(df.columns[[0,-1]], axis=1)
    # 将数据划分为训练集、验证集和测试集
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
    X_train, X_val, y_train, y_val = train_test_split(X_train, y_train, test_size=0.2, random_state=42)
    # 定义 Keras 模型
    model = Sequential()
    model.add(Dense(64, activation='relu', input_dim=X_train.shape[1]))     # 第一层需要给到数据的shape input_dim=X_train.shape[1],也可以input_shape=(X_train.shape[1],)
    model.add(Dense(32, activation='relu'))
    model.add(Dropout(0.5))
    model.add(Dense(4, activation='softmax'))       # 由于需要分类4个类别,最后一层需要输出 4
    model.compile(optimizer=opt, loss='sparse_categorical_crossentropy', metrics=['accuracy'])      # 使用多分类,损失函数为sparse_categorical_crossentropy
    # 训练 Keras 模型
    model.fit(X_train, y_train, epochs=100, batch_size=32, validation_data=(X_val, y_val))
    # 评估 Keras 模型
    score = model.evaluate(X_test, y_test)
    print('Test loss:', score[0])
    print('Test accuracy:', score[1])
    model.save('HBFresult.h5')

会生成.h5文件用于模型部署

模型部署

在前面我们已经成功得到了训练好的模型.h5文件,需要到ML Configurator中生成嵌入式源码.
选择自己预训练的模型,按自己的格式调整以下参数:
在这里插入图片描述
输出以下信息表示源代码生成成功

生成源码后即可进行验证,本模型是分类四个心跳信号神经网络模型,在Class轴能看到4分类的结果

遇到的问题

在部署自己的预训练模型时可能会遇到报错输入数据的维度不匹配的问题,可以无视这段错误,ML Configurator似乎会读取上一个模型用到的csv数据,仔细看输出的日志信息是否成功生成源码。有时候需要重试一下,答主没弄清楚细节,遇到这类报错就这样操作成功了。

不支持selu激活函数的报错:
在这里插入图片描述
数据格式错误,无法用int()将十进制0.0转换,【改动:在生成csv的时候调整保存的格式】
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值