Загрузка нескольких моделей в Python для сравнения результатов модели - PullRequest
0 голосов
/ 07 ноября 2018

Я пытаюсь предсказать классы, используя две разные модели. Эти модели сохраняются и загружаются с использованием файлов .json и .h5.

Проблема, с которой я сталкиваюсь, заключается в том, что в 50% случаев все работает нормально, обе модели созданы правильно и способны выполнять свои прогнозы.

Половина времени, кажется, что-то не так с созданием модели (ей), потому что тогда, когда я пытаюсь что-то предсказать, это дает мне такую ​​ошибку

InvalidArgumentError: You must feed a value for placeholder tensor 'input_1_1' with dtype float and shape [?,10693]
 [[{{node input_1_1}} = Placeholder[dtype=DT_FLOAT, shape=[?,10693], _device="/job:localhost/replica:0/task:0/device:CPU:0"]()]]

Запуск обеих моделей по отдельности / не одновременно работает отлично. Никаких проблем вообще.

После некоторого поиска в Google я обнаружил, что Keras ведет глобальный график моделей, и это может вызвать ошибку. Мне кажется, что я попробовал большинство предложений, которые нашел в Интернете, но я все еще не могу решить проблему наличия в программе двух разных моделей одновременно.

Таким образом, основываясь на данном аргументе, я хочу либо предсказать, используя модель1, либо модель2:

def predict_using_cnn(text, model, tokenizer, to_predict):
if to_predict == 'functiegroep':
    with graph.as_default():
        sequences_test = tokenizer.texts_to_sequences([text])
        X_test = pad_sequences(sequences_test, maxlen=6616)  # TODO fix this hardcoded thingy
        y_pred = model.predict(X_test)
    return build_response(y_pred, to_predict)
elif to_predict == 'kernfunctie':
    with graph.as_default():
        sequences_test = tokenizer.texts_to_sequences([text])
        X_test = pad_sequences(sequences_test, maxlen=10693)  # TODO fix this hardcoded thingy
        y_pred = model.predict(X_test)
    return build_response(y_pred, to_predict)

Это то место, где иногда оно входит в первый оператор if, думая, что ему нужен ввод 10693, который является другой моделью. Таким образом, программа, кажется, смешивает эти вещи наугад.

Обе модели загружаются с использованием одной и той же функции (конечно, они сохраняются в двух разных переменных)

def load_cnn_model(model_name):
print("loading" + str(model_name))
json_file = open(str(model_name) + '.json', 'r')
loaded_model_json = json_file.read()
json_file.close()
model = model_from_json(loaded_model_json)
model.load_weights(str(model_name) + '.h5')
return model

Все, что поможет мне решить эту проблему, очень ценится!

1 Ответ

0 голосов
/ 13 ноября 2018

У меня со временем получилось так:

graph = tf.Graph()
with graph.as_default():
    session = tf.Session()
    with session.as_default():
        graph_fg = graph
        session_fg = session
        cnn_fg_model = predict.load_cnn_model('models/cnn/new_model_fg/new_model_fg')

with graph.as_default():
    session = tf.Session()
    with session.as_default():
        graph_kf = graph
        session_kf = session
        cnn_kf_model = predict.load_cnn_model('models/cnn/new_model_kf/new_model_kf')

with graph.as_default():
    with session.as_default():
        if to_predict == 'functiegroep':
            sequences_test = tokenizer.texts_to_sequences([text])
            X_test = pad_sequences(sequences_test, maxlen=6616)  # TODO fix this hardcoded thingy
            y_pred = model.predict(X_test)
            return build_response_cnn(y_pred, to_predict)
        elif to_predict == 'kernfunctie':
            sequences_test = tokenizer.texts_to_sequences([text])
            X_test = pad_sequences(sequences_test, maxlen=10693)  # TODO fix this hardcoded thingy
            y_pred = model.predict(X_test)
            return build_response_cnn(y_pred, to_predict)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...