Каков самый простой способ развернуть CNN Keras / Tensorflow, доступную как .model .json и .h5 в Google ML Engine?

У меня проблемы с выполнением прогнозов с использованием модели Keras CNN (VGGNet). Это мультиклассовая классификация, принимающая тензор изображения 96x96x3 в качестве входных данных, что дает вектор вероятности размера 114 (классов). Он принят Google ML Engine в качестве допустимой модели, а входное изображение для прогноза image.json имеет правильный формат (одна строка с тензором), но вызов метода gcloud ml-engine прогноз дает следующую ошибку:

"error": "Прогноз не удался: ошибка во время выполнения модели: AbortionError (code = StatusCode.INVALID_ARGUMENT, details = \" Вы должны ввести значение для тензора заполнителя 'Placeholder_1' с dtype float и shape [?, 114] \ n \ t [[Узел: Placeholder_1 = Placeholderdtype = DT_FLOAT, shape = [?, 114], _device = \ "/ job: localhost / replica: 0 / task: 0 / device: CPU: 0 \"]] \ ")"

Мои входные данные для прогнозов image.json содержат

{"x": [ [ [ [ 1.0, 1.0, 1.0 ], ..., [ 1.0, 1.0, 1.0 ] ] ] ]}

а код, генерирующий файл save_model.pb,

def build_graph(x):

  model = load_model("my-model.model")
  labels = pickle.loads(open("labels.pickle", "rb").read())

  # classify the input image
  probabilities = model.predict(x)

  outputs = tf.convert_to_tensor(probabilities)
  saver = tf.train.Saver()

  return outputs, saver

image_path = "testset/testimage.png"
# preprocess the image for classification
image = cv2.imread(image_path)
image = cv2.resize(image, (96, 96))
image = image.astype("float") / 255.0
image = img_to_array(image)
image = np.expand_dims(image, axis=0)

# Do training
with tf.Graph().as_default() as prediction_graph:
  x = image
  outputs = tf.placeholder(tf.float32, shape=[None, 114])
  outputs, saver = build_graph(x)

with tf.Session(graph=prediction_graph) as sess:
  sess.run([tf.local_variables_initializer(), tf.tables_initializer()])
  x = tf.placeholder(tf.float32, shape=[None, 96, 96, 3])
  sess.run(outputs, {x: image})

# export model
export_dir = "export3"
tf.saved_model.simple_save(
    sess,
    export_dir,
    inputs={"x": tf.placeholder(tf.float32, shape=[None, 96, 96, 3])},
    outputs={"y": tf.placeholder(tf.float32, shape=[None, 114])}
)

Что мне здесь не хватает? Есть способ попроще? Модель также доступна в виде файлов .json и .h5, созданных с помощью

# serialize model to JSON
model_json = model.to_json()
with open("my-model.json", "w") as json_file:
json_file.write(model_json)
# serialize weights to HDF5
model.save_weights("my-model.h5")

Спасибо за помощь!


person DataPhil    schedule 25.06.2018    source источник


Ответы (1)


Почему-то ожидаемая форма вывода [Нет, 114] не выполняется.

Я понимаю, что после expand_dims форма изображения будет [1,96,96]. Но поскольку я не знаю, что у вас есть в вашей модели, я не могу знать, как получить вектор вероятности размера 114.

Расплывчатое предложение, учитывая предыдущие пояснения, состоит в том, чтобы проверить, используете ли вы класс tf.Variable в своей модели и не меняете ли вы форму должным образом; поскольку tf.Variable ограничивает вашу возможность изменять форму переменной после ее создания.

Если это не так, опишите подробнее свою модель.

person Héctor Neri    schedule 26.10.2018