概要:承接上文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环境安装
关键环境版本:
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
环境
至此,虚拟环境配置完毕
数据处理
数据集各字段含义如下表
Field | Description |
---|---|
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的时候调整保存的格式】