简体   繁体   English

我如何获得图像识别的概率

[英]how do i get probabilities for image recognition

I have an MNIST CNN. 我有一个MNIST CNN。 the network learning and training from the MNIST dataset and giving a vector of 10 probabilities for each digit (zero to nine), which sums up to 1 (using the softmax of course). 从MNIST数据集中进行网络学习和训练,并为每个数字(从零到九)给出10个概率的向量,该概率总计为1(当然使用softmax)。 I'm trying to change in a way that I will get ten probabilities for each digit, for example, the probability for a chosen image to b 1 is 0.23 so the probability that it doesn't 1 is 0.67, (also sums to 1 but for 10 digits). 我正在尝试以某种方式进行更改,使每个数字获得十个概率,例如,所选图像的b 1的概率为0.23,因此不为1的概率为0.67(也等于1但为10位数字)。 so what I need is 10 different softmax activations, but I cant understand how to do it. 所以我需要10个不同的softmax激活,但是我不知道该怎么做。 this is the original code which calculates 10 probabilities that add up to 1 and eventually gives a calculation of accuracy. 这是原始代码,可计算10个概率之和,这些概率加起来等于1,并最终给出准确性的计算。 there is a way to change the code to give a 10 softmax for each digit? 有没有一种方法可以更改代码,以便为每个数字提供10 softmax?

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import numpy as np
import tensorflow as tf

tf.logging.set_verbosity(tf.logging.INFO)


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=32,kernel_size[5,5], 
   padding="same", activation=tf.nn.relu)

   pool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[2, 2],strides=2)

   conv2 = tf.layers.conv2d(inputs=pool1, filters=64, kernel_size=[5, 5], 
   padding="same", activation=tf.nn.relu)

   pool2 = tf.layers.max_pooling2d(inputs=conv2, pool_size=[2, 2],strides=2)
   pool2_flat = tf.reshape(pool2, [-1, 7 * 7 * 64])

   dense = tf.layers.dense(inputs=pool2_flat, 
   units=1024,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 = {
       "classes": tf.argmax(input=logits, axis=1),
       "probabilities": tf.nn.softmax(logits, name="softmax_tensor")}
   if mode == tf.estimator.ModeKeys.PREDICT:
     return tf.estimator.EstimatorSpec(mode=mode, predictions=predictions)

   loss = tf.losses.sparse_softmax_cross_entropy(labels=labels, 
   logits=logits)


   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)

   eval_metric_ops = {
        "accuracy": 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):
  # 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="/tmp/mnist_convnet_model")

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

  # Train the model
  train_input_fn = tf.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=20000,
      hooks=[logging_hook])

  # Evaluate the model and print results
  eval_input_fn = tf.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()

If I understand your question correctly is that you want independent predictions for each class. 如果我正确理解您的问题,是您想对每个课程进行独立的预测。

The typical way to do that is to use sigmoid instead of softmax for activation and log_loss for the loss. 典型的方法是使用Sigmoid代替softmax进行激活,并使用log_loss进行损耗。

Now each class will be predicted independent of the others, so the probabilities will not sum up to 1. 现在,每个类别的预测将独立于其他类别,因此概率之和不会达到1。

You don't need a separate negative class in this setup. 在此设置中,您不需要单独的否定类。 You can interpret 1-prediciton as the probability for the negative case (the image is not 1 for example). 您可以将1-prediciton解释为否定情况的概率(例如,图像不是1)。

Please note that this approach works best when you want to allow multiple labels for an image (the image can contain a dog and a ball at the same time). 请注意,当您要为图像允许多个标签(该图像可以同时包含一只狗和一个球)时,这种方法最有效。 For MINST dataset where you have a single label softmax tends to perform better. 对于具有单个标签的MINST数据集,softmax往往会表现更好。

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

相关问题 我如何在 DeepPavlov 分类器中获得概率? - How i can get probabilities in DeepPavlov classifier? Pyautogui:具有图像识别功能的自动点击器如何制作仅在识别图像时才运行的 function? - Pyautogui : Autoclicker with Image recognition How do I make a function I made only run if an image is recognised? 如何从概率条形图生成随机向量? - How do I generate random vectors from a bar graph of probabilities? 如何生成具有不同概率的掷骰子? - How do I generate dice rolls with different probabilities? 我怎样才能让程序询问用户他们想从随机元素池中生成多少次尝试,每个元素都有不同的概率? - How can I get the program to ask user how many tries do they want to generate from a random pool of elements, each with different probabilities? 如何从 gpt-2 获取 logit 值作为概率? - how can I get the logit values as probabilities from gpt-2? 如何在 TensorFlow 号码识别中使用自己的手绘图像 - How do I use my own Hand-Drawn Image in TensorFlow Number Recognition 如何获取SGDClassifier(LinearSVM)的概率 - How to get probabilities for SGDClassifier (LinearSVM) 如何获取 TensorFlow 中的日志概率? - How to get log probabilities in TensorFlow? 如何从目录中的许多图像获取face_recognition编码并将其存储在CSV文件中? - How do I get the face_recognition encoding from many images in a directory and store them in a CSV File?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM