找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1058|回复: 0
打印 上一主题 下一主题
收起左侧

STM32cubemx.AI与普通逻辑的区别

[复制链接]
跳转到指定楼层
楼主
ID:891089 发表于 2022-5-2 21:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近看到关于STM32cubemx支持机器学习的例子,感觉很新奇,于是拿来试试,stm32cubemx是基于stm公司的HAL库,新手学起来很是方便,但是不推荐想真正搞懂stm的人去学,因为它会自己配置好gpio,各个功能引脚,少学这些步骤不是真正学会stm32,还是老老实实去用库函数吧。我是拿来玩玩的。
言归正传,搭建python环境废了很大的劲,我的模型因为只是一个demo,所以很简陋,就是对电压进行分级,比如  
一级    ->  v>=8.0
二级    ->  7.8<=v<8.0
三级    ->  v<7.8
先手动输入一些数据进行训练,例如
0
0
0
1
1
0
0
1
2
0
0
1
3
0
0
1
4
0
0
1
7.61
0
0
1
7.62
0
0
1
7.63
0
0
1
7.64
0
0
1
7.65
0
0
1
7.66
0
0
1
7.75
0
0
1
7.78
0
0
1
7.71
0
0
1
7.72
0
0
1
7.8
0
1
0
7.83
0
1
0
7.92
0
1
0
7.85
0
1
0
7.81
0
1
0
7.81
0
1
0
7.84
0
1
0
7.89
0
1
0
7.98
0
1
0
7.88
0
1
0
8.02
1
0
0
8.12
1
0
0
8.05
1
0
0
8.15
1
0
0
8.11
1
0
0
8.01
1
0
0
8.22
1
0
0
8.12
1
0
0
8.14
1
0
0
8.07
1
0
0
经过训练后,输入对应范围的数据,就会有不同的输出,比如,我输入表格中没有的数据是0.5 它会输出1,这是正确的
需要说明的是,我的python程序中并没有类似 If(v<7.8) 输出1 以及其他范围输出2或3,这种逻辑,没有在训练数据中的数据该返回什么完全是它自己判断的,我认为,在某种意义上,也是拥有了某种“智能”的表示。但是,我还是搞不懂,它的意义到底是什么,就像上面说的,明明写几个if()else()就能搞定的问题,为什么要这么麻烦
以上,我是接触了机器学习几天的时间,所以还不是特别了解机器学习的内涵,请大佬批评指正。下面是模型以及程序代码

模型
'''
电源等级检测测试
训练模型阈值
一级    ->  v>=8.0
二级    ->  7.8<=v<8.0
三级    ->  v<7.8

输入层 -> 隐藏层 -> 输出层

'''
'''
电源等级检测测试
训练模型阈值
一级    ->  v>=8.0
二级    ->  7.8<=v<8.0
三级    ->  v<7.8

输入层 -> 隐藏层 -> 输出层

'''

#导入工具包
import tensorflow as tf
import pandas as pd
import numpy as np

#读取数据
data = pd.read_csv(r'e:/data/voltage.csv', sep=',', header=None)
voltage = data.iloc[:,0]
level = data.iloc[:,1:]
level.astype(int)

#建立模型
model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(units=20, activation='relu', input_shape=(1,)))
model.add(tf.keras.layers.Dense(units=10, activation='relu'))
model.add(tf.keras.layers.Dense(units=3, activation='softmax'))
model.summary()

model.compile(optimizer=tf.keras.optimizers.Adam(0.001),
             loss=tf.keras.losses.categorical_crossentropy,
             metrics=[tf.keras.metrics.mse])
history = model.fit(x=voltage, y=level, epochs=40000)

print(model.evaluate(voltage, level))

#保存模型
model.save('level_check.h5')



程序
'''
电源等级检测测试
训练模型阈值
一级    ->  v>=8.0
二级    ->  7.8<=v<8.0
三级    ->  v<7.8
'''
#导入工具包
import tensorflow as tf
import numpy as np

import time
import datetime

#输出函数 输出更加直观
def level_output(level=np.zeros(3)):
    for i in range(level.shape[1]):
        if level[0,i] == 1.0:
            return i+1

#测试电压
test_v = 7.8

t1 = time.time()

#导入模型计算
load_model = tf.keras.models.load_model(r'C:\Users\Administrator\level_check.h5')
out = load_model.predict([test_v])
print(out)

cal_level = np.around(out).astype(int)

t2 = time.time()

#输出能源等级
level = level_output(cal_level)
print(level)
print((int(t2*1000)-int(t1*1000)))

#转换模型为tf lite格式 不量化
converter = tf.lite.TFLiteConverter.from_keras_model(load_model)
tflite_model = converter.convert()

#保存到磁盘
open("level_check.tflite", "wb").write(tflite_model)



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表