简体   繁体   English

如何在张量流中给定的CNN中找到预测概率?

[英]How to find prediction probability in given CNN in tensor flow?

I am very new to TensorFlow. 我是TensorFlow的新手。 Let us assume that I already have a trained convolutional neural network, now I give one new data to this CNN, and I want to see what's the prediction probability in each class. 让我们假设我已经有一个训练有素的卷积神经网络,现在我给这个CNN提供一个新数据,我想看看每个类别中的预测概率是多少。 (eg, the CNN is for handwriting 0-2, now I give a new data 2 to this trained CNN, the prediction probability should give me something like 0.01 for class 0, 0.02 for class 1, and 0.97 for class 2) (例如,CNN用于手写0-2,现在我给这个经过训练的CNN提供新的数据2,预测概率应该给我一些类似于0的0.01、1的0.02和2的0.97)

May I ask someone advise me, what's the right code to do that in TensorFlow (1.13.1) for python? 请问有人可以告诉我,在TensorFlow(1.13.1)中针对python进行编码的正确方法是什么? Sorry about the elementary level question. 对不起小学水平的问题。

I am using the online example MNITS code, 我正在使用在线示例MNITS代码,

import numpy as np
import tensorflow as tf


def cnn_model_fn(features, labels, mode):
  input_layer = tf.reshape(features["x"], [-1, 28, 28, 1])
  conv1 = tf.layers.conv2d(inputs=input_layer, filters=30, kernel_size=[5, 5], padding="same", activation=tf.nn.relu)
  pool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[2, 2], strides=2)
  pool2_flat = tf.reshape(pool1, [-1, 14 * 14 * 30])
  dense = tf.layers.dense(inputs=pool2_flat, units=1000, activation=tf.nn.relu)

  dropout = tf.layers.dropout(inputs=dense, rate=0.4, training=mode == tf.estimator.ModeKeys.TRAIN)

  logits = tf.layers.dense(inputs=dropout, units=10)

  predictions = {
      # Generate predictions (for PREDICT and EVAL mode)
      "classes": tf.argmax(input=logits, axis=1),
      # Add `softmax_tensor` to the graph. It is used for PREDICT and by the
      # `logging_hook`.
      "probabilities": tf.nn.softmax(logits, name="softmax_tensor")
  }

  if mode == tf.estimator.ModeKeys.PREDICT:
    return tf.estimator.EstimatorSpec(mode=mode, predictions=predictions)

  # Calculate Loss (for both TRAIN and EVAL modes)
  loss = tf.losses.sparse_softmax_cross_entropy(labels=labels, logits=logits)

  # Configure the Training Op (for TRAIN mode)
  if mode == tf.estimator.ModeKeys.TRAIN:
    optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.001)
    train_op = optimizer.minimize(
        loss=loss,
        global_step=tf.train.get_global_step())
    return tf.estimator.EstimatorSpec(mode=mode, loss=loss, train_op=train_op)

  # Add evaluation metrics (for EVAL mode)
  eval_metric_ops = {
      "accuracy after all": tf.metrics.accuracy(
          labels=labels, predictions=predictions["classes"])}
  return tf.estimator.EstimatorSpec(
      mode=mode, loss=loss, eval_metric_ops=eval_metric_ops)


def main(unused_argv):
  model_path = "/tmp/mnist_convnet_model"

  # Load training and eval data
  mnist = tf.contrib.learn.datasets.load_dataset("mnist")
  train_data = mnist.train.images  # Returns np.array
  train_labels = np.asarray(mnist.train.labels, dtype=np.int32)
  eval_data = mnist.test.images  # Returns np.array
  eval_labels = np.asarray(mnist.test.labels, dtype=np.int32)

  # Create the Estimator
  mnist_classifier = tf.estimator.Estimator(
      model_fn=cnn_model_fn, model_dir=model_path)

  # Set up logging for predictions
  # Log the values in the "Softmax" tensor with label "probabilities"
  logging_hook = tf.train.LoggingTensorHook(
      tensors={"probabilities": "softmax_tensor"}, every_n_iter=50)

  # Train the model
  train_input_fn = tf.compat.v1.estimator.inputs.numpy_input_fn(
      x={"x": train_data},
      y=train_labels,
      batch_size=100,
      num_epochs=None,
      shuffle=True)
  mnist_classifier.train(
      input_fn=train_input_fn,
      steps=5000,
      hooks=[logging_hook])

  # Evaluate the model and print results
  eval_input_fn = tf.compat.v1.estimator.inputs.numpy_input_fn(
      x={"x": eval_data}, y=eval_labels, num_epochs=1, shuffle=False)
  eval_results = mnist_classifier.evaluate(input_fn=eval_input_fn)
  print(eval_results)


if __name__ == "__main__":
  tf.app.run()

Call the predict method of your estimator (ie, mnist_classifier ) and set predict_keys="probabilities" . 调用您的估算器的predict方法 (即mnist_classifier )并设置predict_keys="probabilities"

The predict method only runs the inference (unlike evaluate without evaluation). 该预测方法只能运行推理(不像evaluate没有评价)。 Setting the key will choose the correct tensor from the dictionary called predictions that you have in the cnn_model_fn method. 设置键将从cnn_model_fn方法中所拥有的称为predictions的字典中选择正确的张量。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM