提供张量流分类器

时间:2017-05-01 14:10:37

标签: python machine-learning tensorflow tensorflow-serving

我一直在与tensorflow的构建器进行斗争,以便能够为我的模型提供服务,我在服务模型后尝试将数据提供给我的分类器

我的问题是如何将输入提供给模型? 我已经看到谷歌初始教程使用的代码

并试图实施它

classify_inputs_tensor_info = utils.build_tensor_info(
          serialized_tf_example)
      classes_output_tensor_info = utils.build_tensor_info(classes)
      scores_output_tensor_info = utils.build_tensor_info(values)

      classification_signature = signature_def_utils.build_signature_def(
          inputs={
              signature_constants.CLASSIFY_INPUTS: classify_inputs_tensor_info
          },
          outputs={
              signature_constants.CLASSIFY_OUTPUT_CLASSES:
                  classes_output_tensor_info,
              signature_constants.CLASSIFY_OUTPUT_SCORES:
                  scores_output_tensor_info
          },
          method_name=signature_constants.CLASSIFY_METHOD_NAME)

根据我的理解,输入被传递给一个名为serialized_tf_example的张量,顾名思义就是将输入序列化为字符串,然后他们使用我不理解的 tf.FixedLenFeature 然后解析serialized_tf_example与 tf.parse_example 并将其分配给模型中使用的x,但我想将其解析为接受数组作为输入的分类器,但不知道如何解决这个问题

在尝试实现这个时我写了这个

serialized_tf_example = tf.placeholder(tf.string, name='tf_example')
        feature_configs = { 'audio/encoded': tf.FixedLenFeature( shape=[193], dtype=tf.float32, default_value=input_x),}
        tf_example = tf.parse_example(serialized_tf_example, feature_configs)
        x = tf_example['audio/encoded']

        sess = tf.InteractiveSession()
        sess.run(tf.global_variables_initializer())

        # Define the dimensions in the feature columns
        feature_columns = [tf.contrib.layers.real_valued_column("", dimension=5)]

        classifier = tf.contrib.learn.DNNLinearCombinedClassifier(
            dnn_feature_columns=feature_columns, dnn_hidden_units=[200,300], n_classes=10,
            dnn_optimizer=tf.train.GradientDescentOptimizer(
                learning_rate=0.01
            )
        )

        #run training
        classifier.fit(input_fn=get_train_inputs, steps=100)
        #testing 
        accuracy_score = classifier.evaluate(input_fn=get_test_inputs, steps=10)["accuracy"]
        print('Test accuracy : ', format(accuracy_score))

        prediction = format(list(classifier.predict_classes(x, as_iterable=True)))

但是x是张量,因此无法读取。当我尝试使用run或.eval()时,它会要求我将值提供给serialized_tf_example

  

InvalidArgumentError(请参阅上面的回溯):您必须提供值   for placeholder tensor'tf_example'with dtype string [[Node:   tf_example = Placeholderdtype = DT_STRING,shape = [],   _device = “/作业:本地主机/复制:0 /任务:0 / CPU:0”]]

当我使用prediction = format(list(classifier.predict_classes(np.array(x),as_iterable = True)) 我得到了

  

InvalidArgumentError(参见上面的回溯):Shape in   shape_and_slice spec [1,200]与存储的形状不匹配   检查点:[193,200] [[节点:save / RestoreV2_1 =   RestoreV2 [dtypes = [DT_FLOAT]   _device =“/ job:localhost / replica:0 / task:0 / cpu:0”](_ recv_save / Const_0,save / RestoreV2_1 / tensor_names,save / RestoreV2_1 / shape_and_slices)]]

1 个答案:

答案 0 :(得分:0)

您可以/应该使用classifier.predict而不使用tf.Example.Your input_fn in train and eval返回x,y。你可以写一个类似于其他输入函数的predict_input_fn。

predictoin = next(classifier.predict_classes(input_fn=predict_input_fn))

请注意,如果您获得list函数的所有预测,则应以异常结束。您可以查看tf.estimator.inputs.numpy_input_fn