Tensorflow Сохранение пустого модельного объекта - PullRequest
0 голосов
/ 17 ноября 2018

Я обучаю классификатор случайных лесов и хочу сохранить модель как объект protobuf (.pb), чтобы использовать его для последующего обслуживания. Когда я пытаюсь сделать это, я получаю объект модели размером 3 КБ (очевидно, ничего не содержит). Соответствующие разделы кода, который я использую, показаны ниже:

params = tensor_forest.ForestHParams\
    (num_features=len(FEATURE_COLUMNS),\
    num_classes=num_classes,\
    regression=False,\
    num_trees=num_trees,\
    min_split_samples=min_split_samples,\
    max_nodes=max_nodes).fill()

with tf.Session() as sess:
    VK = random_forest.TensorForestEstimator(
                        params,model_dir=model_dir, config=tf.contrib.learn.RunConfig(save_checkpoints_secs=60))
    VK.fit(input_fn=train_input_fn, steps=steps)

results = VK.evaluate(input_fn=eval_input_fn, steps=1) #metrics=validation_metrics)
ref_res_predict = list(VK.predict(input_fn=eval_input_fn))

values = [d['probabilities'][d['classes']] for d in ref_res_predict]

export_dir = 'rf_saved_model_2'
print("Exporting trained mode to ", export_dir)
builder = tf.saved_model.builder.SavedModelBuilder(export_dir)

serialized_tf_example = tf.placeholder(tf.string, name='tf_example')
feature_configs = {'x': tf.FixedLenFeature(shape=[101], dtype=tf.float32),}
tf_example = tf.parse_example(serialized_tf_example, feature_configs)
x = tf.identity(tf_example['x'], name='x')
y = tf.placeholder('float', shape=[None, 3])

classification_inputs = tf.saved_model.utils.build_tensor_info(x)
classification_outputs_classes = tf.saved_model.utils.build_tensor_info(y)
classification_outputs_scores = tf.saved_model.utils.build_tensor_info(tf.convert_to_tensor(values))

classification_signature = (
      tf.saved_model.signature_def_utils.build_signature_def(
          inputs={
              tf.saved_model.signature_constants.CLASSIFY_INPUTS:
                  classification_inputs
          },
          outputs={
              tf.saved_model.signature_constants.CLASSIFY_OUTPUT_CLASSES:
                  classification_outputs_classes,
              tf.saved_model.signature_constants.CLASSIFY_OUTPUT_SCORES:
                  classification_outputs_scores
          },
          method_name=tf.saved_model.signature_constants.CLASSIFY_METHOD_NAME))

#classification_signature
tensor_info_x = tf.saved_model.utils.build_tensor_info(x)
tensor_info_y = tf.saved_model.utils.build_tensor_info(y)

prediction_signature = (
tf.saved_model.signature_def_utils.build_signature_def(
        inputs={'csv': tensor_info_x},
        outputs={'scores': tensor_info_y},
        method_name=tf.saved_model.signature_constants.PREDICT_METHOD_NAME))

#prediction_signature
legacy_init_op = tf.group(tf.tables_initializer(), name='legacy_init_op')
builder.add_meta_graph_and_variables(
sess, [tf.saved_model.tag_constants.SERVING],
signature_def_map={
        'predict':
        prediction_signature,
        tf.saved_model.signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY:
        classification_signature,
},
legacy_init_op=legacy_init_op)

builder.save()
...