Какой самый простой способ развертывания Keras/Tensorflow CNN доступен как.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 и формой [?,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")
Спасибо за помощь!
1 ответ
Каким-то образом ожидаемая форма вывода [Нет, 114] не выполняется.
Я понимаю, что после expand_dims форма изображения [1,96,96]. Но так как я не знаю, что у вас есть в вашей модели, я не могу знать, как вы получаете вектор вероятности размера 114.
Принимая во внимание предварительное пояснение, смутное предложение состоит в том, чтобы проверить, используете ли вы в своей модели класс tf.Variable и не изменяете ли вы форму должным образом; поскольку tf.Variable ограничивает вашу способность изменять форму переменной после ее создания.
Если это не так, предоставьте более подробную информацию о вашей модели.