[英]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.