не удается использовать модель.predict () в керасе (тензор потока) - PullRequest
0 голосов
/ 05 марта 2020

background:

Я использую Pycharm с Python 3.6 (не использую более новую версию, потому что у меня есть библиотека, которая не поддерживает более новую версию python ).

Я создал модель ml для антивируса и сохранил ее (попытался сохранить ее как 'anti_virus_model.h5' и в виде папки)

Я пытаюсь создать пользовательский интерфейс для антивируса, поэтому я использую библиотеку tkinter.

Проблема: Я попытался загрузить свою модель (почти уверен, что она работала) и предсказать файл, который был выбран (после превращая заголовок в вектор) Я импортировал тензорный поток и керасы, но функция model.predict (pe), похоже, не распознается pycharm. [pe - мой вектор]

вот мой код:

from tkinter import *
from tkinter import filedialog
from tensorflow import keras

import vector_build
import tkinter as Tk
import tensorflow as tf



tf.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 found
2020-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 found
2020-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-GT2BTVK
2020-03-05 12:37:16.841817: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:176] hostname: DESKTOP-GT2BTVK
2020-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: AVX2
WARNING: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 callback
Traceback (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

(процесс не прерывается sh, я его закрыл)

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 05 марта 2020

Переведите вашу проблему в нечто, что вы можете легко протестировать! Наличие «полноценной» программы GUI здесь не лучший способ убедиться, что различные фрагменты работают должным образом.

  1. У вас есть несколько импортов одной и той же вещи, включая * импорт, который запутает вещи.
  2. load_model() возвращает экземпляр модели; Вы нигде не используете это.

Упрощая вещи, чтобы отделить пользовательский интерфейс от фактического кода предсказания, вы получаете что-то, что легко тестируется:

import tkinter as Tk
from tkinter import filedialog
from tensorflow import keras
import vector_build

model = keras.models.load_model("anti_virus_model.h5")


def predict_file(fname):
    print(fname)  # Debugging
    pe = vector_build.encode_pe(fname)
    print(pe)  # Debugging
    result = model.predict(pe)
    print(result)  # Debugging
    return result


def browse_file():
    fname = filedialog.askopenfilename(filetypes=(("exe files", "*.exe"),))
    result = predict_file(fname)
    # TODO: Do something with `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:  # First make this branch work correctly,
    predict_file("C:/Windows/Calc.exe")
else:  # ... then switch to this.
    ui_main()
0 голосов
/ 06 марта 2020

Вам нужно сохранить загруженную модель с именем (переменной) и использовать это для предиката ().

Замените эти 2 строки:

tf.keras.models.load_model('anti_virus_model.h5')
......
    print(keras.model.predict(pe))

следующим.

model = tf.keras.models.load_model('anti_virus_model.h5')
......
    print(model.predict(pe))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...