将keras训练好的神经网络模型生成独立于python环境运行的.exe文件并在matlab中调用(上篇)

keras是深度学习简单易上手的python第三方库。在实际应用中,常常需要将keras训练好的深度学习模型生成独立于python环境的文件,供不会python的人或未安装python环境的设备调用。在windows环境下比较好的选择是生成.exe文件。虽然在matlab中可以采用https://zhuanlan.zhihu.com/p/92081119的方法直接调用python,但是当python中导入一些第三方库时,该调用方法常常产生问题,这些问题很难很好地解决。因此,将keras训练好的深度学习模型生成独立于python环境的EXE文件,供matlab调用,是一个非常好的选择。本文对此进行了成功的探索。本文主要内容如下

  1. 利用keras构建一个简单的深度学习模型
  2. 利用PyInstaller将python文件编译成.exe文件
  3. .exe文件功能测试
  4. matlab中调用该.exe文件
    由于本文篇幅较长,分上下两部分,上篇主要介绍内容1和内容2. 下篇介绍内容3和内容4,下篇的链接为https://blog.csdn.net/graceful_snow/article/details/103228785

一、 利用keras构建一个简单的深度学习模型

输入变量具有两个特征,输出变量具有一个特征,数据存在data.mat文件中。利用keras构建一个单隐含层的神经网络,进行简单的回归预测,并将训练好的神经网络参数存在bp.h5文件中,具体代码如下

import numpy as np
import tensorflow as tf
import keras
from keras.models import Sequential
from keras.layers import Conv2D,MaxPooling2D, Dense, Flatten, Reshape,Dropout
from keras.optimizers import SGD,Adam
from tensorflow.examples.tutorials.mnist import input_data
import matplotlib.pyplot as plt
import scipy.io

a=scipy.io.loadmat('data.mat')
x=a['x']
y=a['alpha']
xtrain=x[0:110000,:]
xtest=x[110000:,:]
ytrain=y[0:110000,:]
ytest=y[110000:,:]
xntrain=(xtrain-np.min(xtrain,axis=0))/(np.max(xtrain,axis=0)-np.min(xtrain,axis=0))#normalize the training dato to (0,1)
xntest=(xtest-np.min(xtrain,axis=0))/(np.max(xtrain,axis=0)-np.min(xtrain,axis=0))
yntrain=(ytrain-np.min(ytrain,axis=0))/(np.max(ytrain,axis=0)-np.min(ytrain,axis=0))#normalize the training dato to (0,1)
yntest=(ytest-np.min(ytrain,axis=0))/(np.max(ytrain,axis=0)-np.min(ytrain,axis=0))

num_inputs =2  # 2 features
num_layers = 1
num_neurons = [15]    
learning_rate = 0.001
n_epochs = 40
batch_size = 64

model = Sequential()
model.add(Dense(units=num_neurons[0], activation='sigmoid', 
                input_shape=(num_inputs,)))
model.add(Dense(units=1)) 
model.summary()
model.compile(loss='mse',
              optimizer=Adam(lr=learning_rate))
model.fit(xntrain, yntrain,
                    batch_size=batch_size,
                    epochs=n_epochs)
y_pre=model.predict(xntest)
score = model.evaluate(xntest, yntest)
print('\nTest loss:', score)

plt.plot(y_pre,'r')
plt.ion
plt.plot(yntest,'b')
plt.figure()
plt.plot(y_pre*(np.max(ytrain,axis=0)-np.min(ytrain,axis=0))+np.min(ytrain,axis=0),'r')
plt.ion
plt.plot(yntest*(np.max(ytrain,axis=0)-np.min(ytrain,axis=0))+np.min(ytrain,axis=0),'b')

##save trained model
model.save('bp.h5')

新撰写一个python文件,命名为mlp.py, 用于调用训练好的神经网络参数,对输入数据进行预测,并将预测结果保存在y_pre.txt文件中。该文件具体代码如下

import numpy as np
import keras
import scipy.io

a=scipy.io.loadmat('data.mat')
x=a['x']
y=a['alpha']
xtrain=x[0:110000,:]
xtest=x[110000:,:]
ytrain=y[0:110000,:]
ytest=y[110000:,:]
xntrain=(xtrain-np.min(xtrain,axis=0))/(np.max(xtrain,axis=0)-np.min(xtrain,axis=0))#normalize the training dato to (0,1)
xntest=(xtest-np.min(xtrain,axis=0))/(np.max(xtrain,axis=0)-np.min(xtrain,axis=0))
yntrain=(ytrain-np.min(ytrain,axis=0))/(np.max(ytrain,axis=0)-np.min(ytrain,axis=0))#normalize the training dato to (0,1)
yntest=(ytest-np.min(ytrain,axis=0))/(np.max(ytrain,axis=0)-np.min(ytrain,axis=0))

model1 = keras.models.load_model("bp.h5")  # load models
weight_dense_27,bias_dense_27 = model1.get_layer('dense_27').get_weights()
weight_dense_28,bias_dense_28 = model1.get_layer('dense_28').get_weights()
y_pre=model1.predict(xntest)
np.savetxt('y_pre.txt', y_pre) #save predicted results

二、利用PyInstaller将python文件编译成.exe文件

PyInstaller是将python文件编译成exe文件的常用第三方库,具体安装过程见我的上一篇博客
https://blog.csdn.net/graceful_snow/article/details/103216781
第一步,将要生成exe文件的mlp.pydata.matbp.h5三个文件放在同一个文件夹下,我放在了D盘的mlpinference子文件的mlp文件夹下。
在这里插入图片描述
在这里插入图片描述
第二步,进入anaconda powershell prompt, 利用cd命令进入上述文件夹 在这里插入图片描述
第三步 ,在anaconda powershell prompt中输入PyInstaller --add-data "data.mat; data" --add-data "bp.h5; weight" mlp.py命令,该命令表示将mlp.py文件生成.exe,同时将data.mat文件添加至data文件夹下,"bp.h5"文件添加至weight文件夹下。在输入该命令后会产生一个dist文件夹,里面有mlp子文件夹,可运行的exe文件及相应的其他编译后的依赖文件均在mlp子文件夹中。如果只想要一个exe文件,可以用PyInstaller --add-data "data.mat; data" --add-data "bp.h5; weight" -F mlp.py命令,但是这样一个exe文件,因为它太大了,运行的速度远不如前一种方法(PyInstaller --add-data "data.mat; data" --add-data "bp.h5; weight" mlp.py命令产生的结果文件)。关于PyInstaller各个命令的具体含义,推荐以下博客https://www.cnblogs.com/aziji/articles/9708258.html,以及PyInstaller官网https://pyinstaller.readthedocs.io/en/stable/spec-files.html
(期间也参考了博客https://blog.csdn.net/weixin_34226182/article/details/93664045https://www.cnblogs.com/stigerzergold/p/9601319.html,但是没有用这两个博客中介绍的方法,而是在PyInstaller官网中找到了下图所示的更简单的方法)
在这里插入图片描述
第四步,解决第三步运行中的报错问题。
在第三步运行的过程中,会报如图所示的错误。
在这里插入图片描述
该错误的解决方法在博客https://blog.csdn.net/youzhouliu/article/details/77828658和博客https://www.cnblogs.com/huipengbo/p/9856361.html中进行了详细的介绍,具体报错原因,在博客https://blog.csdn.net/vblittleboy/article/details/6613815中进行了分析,这里仅给出解决方案,即:
(1)修改mlp.spec文件,具体方法为用记事本打开该文件,在图示位置处加入红色方框圈出的代码,然后保存文件。 在这里插入图片描述
(2)在anaconda powershell prompt中输入命令PyInstaller mlp.spec
在这里插入图片描述
(3)进入漫长的等待过程,大约5分钟左右,会成功完成编译,出现以下界面即为成功
在这里插入图片描述
在这里插入图片描述
如果报错缺少google-cloud-core,则pip install google-cloud-core, 同时编译时采用

PyInstaller mlp.py –additional-hooks-dir=.

后面的内容见下篇,下篇的链接为https://blog.csdn.net/graceful_snow/article/details/103228785
参考:
https://blog.csdn.net/qq_44703886/article/details/109763756

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值