|
|
最近看到關(guān)于STM32cubemx支持機(jī)器學(xué)習(xí)的例子,感覺(jué)很新奇,于是拿來(lái)試試,stm32cubemx是基于stm公司的HAL庫(kù),新手學(xué)起來(lái)很是方便,但是不推薦想真正搞懂stm的人去學(xué),因?yàn)樗鼤?huì)自己配置好gpio,各個(gè)功能引腳,少學(xué)這些步驟不是真正學(xué)會(huì)stm32,還是老老實(shí)實(shí)去用庫(kù)函數(shù)吧。我是拿來(lái)玩玩的。
言歸正傳,搭建python環(huán)境廢了很大的勁,我的模型因?yàn)橹皇且粋(gè)demo,所以很簡(jiǎn)陋,就是對(duì)電壓進(jìn)行分級(jí),比如
一級(jí) -> v>=8.0
二級(jí) -> 7.8<=v<8.0
三級(jí) -> v<7.8
先手動(dòng)輸入一些數(shù)據(jù)進(jìn)行訓(xùn)練,例如
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 | 經(jīng)過(guò)訓(xùn)練后,輸入對(duì)應(yīng)范圍的數(shù)據(jù),就會(huì)有不同的輸出,比如,我輸入表格中沒(méi)有的數(shù)據(jù)是0.5 它會(huì)輸出1,這是正確的
需要說(shuō)明的是,我的python程序中并沒(méi)有類似 If(v<7.8) 輸出1 以及其他范圍輸出2或3,這種邏輯,沒(méi)有在訓(xùn)練數(shù)據(jù)中的數(shù)據(jù)該返回什么完全是它自己判斷的,我認(rèn)為,在某種意義上,也是擁有了某種“智能”的表示。但是,我還是搞不懂,它的意義到底是什么,就像上面說(shuō)的,明明寫幾個(gè)if()else()就能搞定的問(wèn)題,為什么要這么麻煩
以上,我是接觸了機(jī)器學(xué)習(xí)幾天的時(shí)間,所以還不是特別了解機(jī)器學(xué)習(xí)的內(nèi)涵,請(qǐng)大佬批評(píng)指正。下面是模型以及程序代碼
模型
'''
電源等級(jí)檢測(cè)測(cè)試
訓(xùn)練模型閾值
一級(jí) -> v>=8.0
二級(jí) -> 7.8<=v<8.0
三級(jí) -> v<7.8
輸入層 -> 隱藏層 -> 輸出層
'''
'''
電源等級(jí)檢測(cè)測(cè)試
訓(xùn)練模型閾值
一級(jí) -> v>=8.0
二級(jí) -> 7.8<=v<8.0
三級(jí) -> v<7.8
輸入層 -> 隱藏層 -> 輸出層
'''
#導(dǎo)入工具包
import tensorflow as tf
import pandas as pd
import numpy as np
#讀取數(shù)據(jù)
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')
程序
'''
電源等級(jí)檢測(cè)測(cè)試
訓(xùn)練模型閾值
一級(jí) -> v>=8.0
二級(jí) -> 7.8<=v<8.0
三級(jí) -> v<7.8
'''
#導(dǎo)入工具包
import tensorflow as tf
import numpy as np
import time
import datetime
#輸出函數(shù) 輸出更加直觀
def level_output(level=np.zeros(3)):
for i in range(level.shape[1]):
if level[0,i] == 1.0:
return i+1
#測(cè)試電壓
test_v = 7.8
t1 = time.time()
#導(dǎo)入模型計(jì)算
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()
#輸出能源等級(jí)
level = level_output(cal_level)
print(level)
print((int(t2*1000)-int(t1*1000)))
#轉(zhuǎn)換模型為tf lite格式 不量化
converter = tf.lite.TFLiteConverter.from_keras_model(load_model)
tflite_model = converter.convert()
#保存到磁盤
open("level_check.tflite", "wb").write(tflite_model)
|
|