背景:
我使用的是Pycharm和Python 3.6(没有使用更新的版本,因为我有一个库不支持更新的Python版本)。
我为一个反病毒软件构建了一个机器学习模型,并保存了它(尝试保存为’anti_virus_model.h5’和一个文件夹)。
我正在尝试为反病毒软件构建一个用户界面,因此我在使用tkinter库。
问题:我尝试加载我的模型(几乎可以肯定它工作了)并预测选中的文件(在将头部转换为向量后)。我已经导入了tensorflow和keras,但是函数model.predict(pe)似乎没有被Pycharm识别。[pe是我的向量]
这是我的代码:
from tkinter import *from tkinter import filedialogfrom tensorflow import kerasimport vector_buildimport tkinter as Tkimport tensorflow as tftf.keras.models.load_model('anti_virus_model.h5')def browse_file(): fname = filedialog.askopenfilename(filetypes=(("exe files", "*.exe"), ("exe files", "*.exe"))) print(fname) pe = vector_build.encode_pe(fname) print(pe) print(keras.model.predict(pe))root = Tk.Tk()root.wm_title("Browser")broButton = Tk.Button(master=root, text='Browse', width=80, height=25, command=browse_file)broButton.pack(side=Tk.LEFT, padx=2, pady=2)Tk.mainloop()
选择文件后我得到的错误是:
2020-03-05 12:37:14.611731: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library 'cudart64_101.dll'; dlerror: cudart64_101.dll not found2020-03-05 12:37:14.611883: I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not have a GPU set up on your machine.2020-03-05 12:37:16.837699: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library 'nvcuda.dll'; dlerror: nvcuda.dll not found2020-03-05 12:37:16.837815: E tensorflow/stream_executor/cuda/cuda_driver.cc:351] failed call to cuInit: UNKNOWN ERROR (303)2020-03-05 12:37:16.841558: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:169] retrieving CUDA diagnostic information for host: DESKTOP-GT2BTVK2020-03-05 12:37:16.841817: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:176] hostname: DESKTOP-GT2BTVK2020-03-05 12:37:16.842185: I tensorflow/core/platform/cpu_feature_guard.cc:142] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2WARNING:tensorflow:Sequential models without an `input_shape` passed to the first layer cannot reload their optimizer state. As a result, your model isstarting with a freshly initialized optimizer.C:/Program Files (x86)/Steam/Steam.exe*(big vector, no need to include)*Exception in Tkinter callbackTraceback (most recent call last): File "C:\Users\0123m\AppData\Local\Programs\Python\Python36\lib\tkinter\__init__.py", line 1705, in __call__ return self.func(*args) File "C:/Users/0123m/PycharmProjects/anti_virus_project/predictorUI.py", line 18, in browse_file print(keras.model.predict(pe))AttributeError: 'numpy.ndarray' object has no attribute 'model'Process finished with exit code 0
(进程没有崩溃,我是手动关闭的)
提前感谢!
回答:
重构你的问题,使其易于测试!在这里拥有“全功能”的GUI程序并不是确保各个部分按预期工作的最佳方式。
- 你对同一个东西进行了多次导入,包括一个
*
导入,这会造成混淆。 load_model()
返回一个模型实例;你没有在任何地方使用它。
简化事物以将UI与实际的预测代码分离,你会得到一个易于测试的东西:
import tkinter as Tkfrom tkinter import filedialogfrom tensorflow import kerasimport vector_buildmodel = keras.models.load_model("anti_virus_model.h5")def predict_file(fname): print(fname) # 调试 pe = vector_build.encode_pe(fname) print(pe) # 调试 result = model.predict(pe) print(result) # 调试 return resultdef browse_file(): fname = filedialog.askopenfilename(filetypes=(("exe files", "*.exe"),)) result = predict_file(fname) # TODO: 对`result`做些什么def ui_main(): root = Tk.Tk() root.wm_title("Browser") broButton = Tk.Button(master=root, text="Browse", width=80, height=25, command=browse_file) broButton.pack(side=Tk.LEFT, padx=2, pady=2) Tk.mainloop()if True: # 首先使这个分支正确工作, predict_file("C:/Windows/Calc.exe")else: # ... 然后切换到这个。 ui_main()