Использование обученной модели керас в google ml-engine - PullRequest
0 голосов
/ 22 февраля 2019

Я пытаюсь использовать gcloud ml-engine с tenorflow, точнее, я бы хотел использовать уже обученную модель keras.

Мне удалось сделать это с моделью sciktlearn, но здесь это не то же самое...

Сначала я тренирую простую модель с Керасом

import numpy as np
from tensorflow import keras

# Creating the dataset
X = np.random.random((500,9))
y = (np.random.random(500)>0.5).astype(int)

# Splitting 
idx_train, idx_test = np.arange(400), np.arange(400,500)
X_train, X_test = X[idx_train], X[idx_test]
y_train, y_test = y[idx_train], y[idx_test]



def define_model():    
    input1 = keras.layers.Input(shape=(9,),name="values")
    hidden = keras.layers.Dense(50, activation='relu', name="hidden")(input1)

    preds = keras.layers.Dense(1, activation='sigmoid', name="labels")(hidden)

    model = keras.models.Model(inputs=input1, 
                  outputs=preds)

    model.compile(loss='binary_crossentropy',
                  optimizer='adam', 
                  metrics=["accuracy"])
    model.summary()

    return model

model = define_model()
model.fit(X_train, y_train,
          batch_size=10, 
          epochs=10, validation_split=0.2)

Я прочитал, мне нужен SavedModel, чтобы использовать его в ml-engine здесь https://cloud.google.com/ml-engine/docs/tensorflow/deploying-models

КажетсяЯ должен преобразовать его в оценщик

model.save("./model_trained_test.h5")
estimator_model = keras.estimator.model_to_estimator(keras_model_path="./model_trained_test.h5")

Мне удается сделать прогноз с помощью этого оценщика

def input_function(features,labels=None,shuffle=False):
    input_fn = tf.estimator.inputs.numpy_input_fn(
        x={"values": features},
        y=labels,
        shuffle=shuffle
    )
    return input_fn
score = estimator_model.evaluate(input_function(X_test, labels=y_test.reshape(-1,1)))

Чтобы экспортировать его в SavedModel, мне нужен serve_input_receiver_fn.Я не нашел в интернете пример моей ситуации, которая показалась мне простой, поэтому я попробовал эту функцию, а затем сохранил модель в папке "here_are_estimators"

feature_spec = {'values': tf.FixedLenFeature(9, dtype=tf.float32)}

def serving_input_receiver_fn():

    serialized_tf_example = tf.placeholder(dtype=tf.string,
                                           shape=[None],
                                           name='input_tensors')
    receiver_tensors = {'examples': serialized_tf_example}
    features = tf.parse_example(serialized_tf_example, feature_spec)
    return tf.estimator.export.ServingInputReceiver(features, receiver_tensors)

estimator_model.export_savedmodel("./here_are_estimators",
                                  serving_input_receiver_fn=serving_input_receiver_fn)

мой input.json выглядиткак это

{"examples":[{"values":[[0.2,0.3,0.4,0.5,0.9,1.5,1.6,7.3,1.5]]}]}

Я загрузил содержимое сгенерированного файла, папку переменных и файл сохраненный_модель.pb в GCS в каталоге DEPLOYMENT_SOURCE

Когда я пытаюсь запустить локальный прогноз сgcloud с этой командой:

gcloud ml-engine local predict --model-dir $DEPLOYMENT_SOURCE --json-instances="input.json" --verbosity debug --framework tensorflow

У меня есть эта ошибка

cloud.ml.prediction.prediction_utils.PredictionError: Failed to run the provided model: Exception during running the graph: Cannot feed value of shape (1, 1) for Tensor 'input_tensors:0', which has shape '(?,)' (Error code: 2)

Я думаю, что-то не так с моим input.json или serve_input_receiver_fn, или с обоими?, но я не могу узнатькакие.Если кто-то может сказать мне, что не так, это будет высоко ценится:)

1 Ответ

0 голосов
/ 22 февраля 2019

Вы не должны пытаться анализировать tf.Example, так как вы отправляете JSON.Попробуйте это для экспорта:

def serving_input_receiver_fn(): 
    inputs = {"values": tf.placeholder(dtype=tf.float32,
                                       shape=[None, 9],
                                       name='input_tensors')}
    return tf.estimator.export.ServingInputReceiver(inputs, inputs) 

estimator_model.export_savedmodel("./here_are_estimators", serving_input_receiver_fn=serving_input_receiver_fn)

Ввод должен выглядеть следующим образом:

{"values":[0.2,0.3,0.4,0.5,0.9,1.5,1.6,7.3,1.5]}

Существует также более краткая «стенография»:

[0.2,0.3,0.4,0.5,0.9,1.5,1.6,7.3,1.5]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...