程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

python預測工程打包遇到的一些問題

編輯:Python

tensorflow項目打包

  • 1.版本匹配問題
    • 1)
    • 2)
  • 2.打包spec修改
  • 3.加載模型遇到的問題

1.版本匹配問題

我們的服務器版本是centOS7,所以相對應的一些其他的依賴包版本如下:

包版本python環境3.6tensorflow1.5.0keras2.1.6h5py2.10.0sklearn0.24.2numpy1.19.5flask2.0.1pip21.2.4

版本不匹配會報一些問題,比如:

1)

import tensorflow.python as tf
AttributeError: module 'tensorflow' has no attribute 'python'。

另外上面這個問題發生後,我們盡量不要用tensorflow.python點的這種方式來引用包,比如要用backend,就寫成如下兩行:

from tensorflow import keras
from keras import backend

2)

Traceback (most recent call last):
File "webapi.py", line 40, in <module>
File "keras/models.py", line 768, in load_weights
File "keras/engine/topology.py", line 3339, in load_weights_from_hdf5_group
AttributeError: 'str' object has no attribute 'decode'
[17766] Failed to execute script 'HFwebapi' due to unhandled exception!

這是keras生成的h5模型,在調用load模型時,發生的報錯。
solution:
這是h5py模塊的版本不匹配,改為2.10.0即可解決(先卸載當前的版本,我的是3.1.0,然後再安裝)。

2.打包spec修改

因為我需要把配置文件夾、生成的模型文件、日志文件夾生成到打包後的文件夾中,所以,需要修改spec文件。

a = Analysis(['webapi.py'],
pathex=['/home/Downloads/20211101'],
binaries=[('./conf','conf'),('./saved_models','saved_models'),('./Logs','Logs'),
],
datas=[],
hiddenimports=[],
hookspath=[],
hooksconfig={
},
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)

如上面所示,要把指定的文件夾生成到指定的目錄中去,在binaries中添加即可。
改完spec以後,每次的打包需要記得由

pyinstaller -D webapi.py

改為

pyinstaller -D webapi.spec

3.加載模型遇到的問題

File "/apps/webapi/tensorflow/python/framework/ops.py", line 3402, in _as_graph_element_locked
ValueError: Tensor Tensor("dense_9/BiasAdd:0", shape=(?, 1), dtype=float32) is not an element of this graph.
 File "/apps/keras/models.py", line 273, in load_model
File "/apps/keras/engine/topology.py", line 3393, in load_weights_from_hdf5_group
File "/apps/keras/backend/tensorflow_backend.py", line 2377, in batch_set_value
File "/apps/tensorflow/python/client/session.py", line 895, in run
File "/apps/tensorflow/python/client/session.py", line 1073, in _run
TypeError: Cannot interpret feed_dict key as Tensor: Tensor Tensor("Placeholder:0", shape=(240, 400), dtype=float32) is not an element of this graph.

參考
https://www.jianshu.com/p/c84ae0527a3f
https://www.cnblogs.com/yanjj/p/8242595.html
這個問題是在調用h5模型時產生的。
solution
在初始化加載模型之後,就隨便生成一個向量讓 model 執行一次 predict 函數,之後再使用就不會有問題了。
load_model後,加一句:

model.predict(np.zeros((1,50,29)))

如上修改後,再打包運行會發現接口可以成功調用一次,第二次就又失敗了。
這個問題,下面的blog描述了解決方法:
https://blog.csdn.net/selfimpro_001/article/details/99693273
session是tensorflow中常見的會話。
clear_session: destroys the current TF graph and creates a new one. Useful to avoid clutter from old models/layers.
TF graph函數,可以通過tensorboard用圖形化界面展示出來流程結構,可以整合一段代碼為一個整體存在於一個圖中。
如果不添加clear_session(),每次加載模型,graph上的node就會越來越多,最終導致時間、內存問題。


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved