Недавно я создал пользовательскую нейронную сеть со следующим кодом для базовой архитектуры:
def gen_base_model(n_class):
cnn_model = InceptionResNetV2(include_top=False, input_shape=(width, width, 3), weights='imagenet')
inputs = Input((width, width, 3))
x = inputs
x = Lambda(preprocess_input, name='preprocessing')(x)
x = cnn_model(x)
x = GlobalAveragePooling2D()(x)
x = Dropout(0.5)(x)
x = Dense(n_class, activation='softmax', name='softmax')(x)
model = Model(inputs, x)
return model
Я обучил модель и теперь хочу развернуть модель на Cloud ML Engine / AI Platform.
Я использовал следующий код для преобразования и сохранения модели keras в качестве сохраненной модели:
def convert_and_save(model, path):
full_path = './savedmodels/' + path
signature = tf.saved_model.signature_def_utils.predict_signature_def(
inputs={'image': model.input}, outputs={'scores': model.output})
builder = tf.saved_model.builder.SavedModelBuilder(full_path)
builder.add_meta_graph_and_variables(
sess=K.get_session(),
tags=[tf.saved_model.tag_constants.SERVING],
signature_def_map={
tf.saved_model.signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY:
signature
})
builder.save()
Однако сейчас у меня возникают проблемы при создании экземпляра для прогнозирования выходных данных.Веб-сайт Google Cloud указывает следующий формат:
{"instances": [<instance>, <instance>, ...]}
Я попытался использовать следующий код для преобразования изображения:
width = 299
image_pre = cv2.resize(cv2.imread('image.jpg'), (width, width))
img_pred = np.expand_dims(image_pre, axis=0)
print(img_pred.shape)
img_pred_1 = img_pred.tolist()
instances = {'image': img_pred_1}
Но произошла ошибка со следующей ошибкой:
RuntimeError: Prediction failed: Error during model execution: AbortionError(code=StatusCode.INVALID_ARGUMENT, details="input must be 4-dimensional[1,1,299,299,3]
[[{{node inception_resnet_v2/conv2d_1/convolution}}]]")
Кроме того, я использую следующий код (керас) для прогнозов при локальном использовании модели:
width = 299
image_pre = cv2.resize(cv2.imread('image.jpg'), (width, width))
img_pred = np.expand_dims(image_pre, axis=0)
prediction = model.predict(img_pred)
ind = np.argmax(prediction[0])
predicted_class = model_classes[ind]