使用 Tensorflow 的初学者 Softmax 图像分类

Beginner Softmax Image Classification using Tensorflows

大家好,来自世界各地的人们,

我使用的原始源代码来自:

https://github.com/martin-gorner/tensorflow-mnist-tutorial/blob/master/mnist_1.0_softmax.py

并修改为:

import tensorflow as tf
import numpy
from PIL import Image

tf.set_random_seed(0)

#Image
filenames = 'gray_kitten.jpg'

img = Image.open(filenames) 

num_maps = 3

img = numpy.asarray(img, dtype='float32') / 256.

img_shape = img.shape

img_reshaped = img.reshape(1, img_shape[0], img_shape[1], num_maps)

#Label

label = numpy.zeros((10))

#Manual label value assignment
label[0] = 1

label = numpy.array(label,dtype = numpy.float32)

label = tf.convert_to_tensor(label,tf.float32)


X = tf.placeholder(tf.float32, [1, None, None, 3])

Y_ = tf.placeholder(tf.float32, [None, 10])


W = tf.Variable(tf.zeros([(img_shape[0] * img_shape[1]), 10]))


b = tf.Variable(tf.zeros([10]))

XX = tf.reshape(X, [-1, (img_shape[0] * img_shape[1])])


# The model
Y = tf.nn.softmax(tf.matmul(XX, W) + b)


cross_entropy = -tf.reduce_mean(Y_ * tf.log(Y)) * 10.0

correct_prediction = tf.equal(tf.argmax(Y, 1), tf.argmax(Y_, 1))

accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

train_step = tf.train.GradientDescentOptimizer(0.005).minimize(cross_entropy)

allweights = tf.reshape(W, [-1])

allbiases = tf.reshape(b, [-1])


# init
init = tf.global_variables_initializer()

sess = tf.Session()
sess.run(init)


label = sess.run([label])


# You can call this function in a loop to train the model
def training_step(i, update_test_data, update_train_data):



    if update_train_data:

    a, c, w, b = sess.run([accuracy, cross_entropy, allweights, allbiases], feed_dict={X: img_reshaped, Y_: label})
    print(str(i) + ": accuracy:" + str(a) + " loss: " + str(c))


    if update_test_data:

        a, c = sess.run([accuracy, cross_entropy], feed_dict={X: img_reshaped, Y_: label})
    print("test accuracy:" + str(a) + " test loss: " + str(c))

    # the backpropagation training step
    sess.run(train_step, feed_dict={X: img_reshaped, Y_: label})

for i in range(100+1): 
    training_step(i, i % 50 == 0, i % 10 == 0)

当我执行程序时,它会产生以下输出:

    0: accuracy:1.0 loss: 2.30259
    test accuracy:1.0 test loss: 2.30259
    10: accuracy:1.0 loss: nan
    20: accuracy:1.0 loss: nan
    30: accuracy:1.0 loss: nan
    40: accuracy:1.0 loss: nan
    50: accuracy:1.0 loss: nan
    test accuracy:1.0 test loss: nan
    60: accuracy:1.0 loss: nan
    70: accuracy:1.0 loss: nan
    80: accuracy:1.0 loss: nan
    90: accuracy:1.0 loss: nan
    100: accuracy:1.0 loss: nan
    test accuracy:1.0 test loss: nan

我实际上在看的是,我希望有人能告诉我,我在使用 tensorflow 的 soft-max 算法进行图像分类时是否有任何错误......? 因为损失部分产生 "nan" 值而不是“0”? 而且我不确定我的标签是正确还是错误。

谢谢

感谢@xxi,我设法修复了由先前的交叉熵方程或公式产生的 "nan" 值。

import tensorflow as tf
import numpy
from PIL import Image

tf.set_random_seed(0)

#Image
filenames = 'gray_kitten.jpg'

img = Image.open(filenames) 

num_maps = 3

img = numpy.asarray(img, dtype='float32') / 256.

img_shape = img.shape

img_reshaped = img.reshape(1, img_shape[0], img_shape[1], num_maps)

#Label

label = numpy.zeros((10))

#Manual label value assignment
label[0] = 1

label = numpy.array(label,dtype = numpy.float32)

label = tf.convert_to_tensor(label,tf.float32)


X = tf.placeholder(tf.float32, [1, None, None, 3])

Y_ = tf.placeholder(tf.float32, [None, 10])


W = tf.Variable(tf.zeros([(img_shape[0] * img_shape[1]), 10]))


b = tf.Variable(tf.zeros([10]))

XX = tf.reshape(X, [-1, (img_shape[0] * img_shape[1])])


# The model
Y = tf.nn.softmax(tf.matmul(XX, W) + b)


#cross_entropy = -tf.reduce_mean(Y_ * tf.log(Y)) * 10.0
cross_entropy = -tf.reduce_mean(Y_ * tf.log(tf.clip_by_value(Y, 1e-10, 1.0))) * 10.0

correct_prediction = tf.equal(tf.argmax(Y, 1), tf.argmax(Y_, 1))

accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

train_step = tf.train.GradientDescentOptimizer(0.005).minimize(cross_entropy)

allweights = tf.reshape(W, [-1])

allbiases = tf.reshape(b, [-1])


# init
init = tf.global_variables_initializer()

sess = tf.Session()
sess.run(init)


label = sess.run([label])


# You can call this function in a loop to train the model
def training_step(i, update_test_data, update_train_data):

    if update_train_data:
        #Train Data
        a, c, w, b = sess.run([accuracy, cross_entropy, allweights, allbiases], feed_dict={X: img_reshaped, Y_: label})
        print(str(i) + ": accuracy:" + str(a) + " loss: " + str(c))

    if update_test_data:
        #Test Data
        a, c = sess.run([accuracy, cross_entropy], feed_dict={X: img_reshaped, Y_: label})
        print(str(i) + ": ********* epoch " +  " ********* test accuracy:" + str(a) + " test loss: " + str(c))

    # the backpropagation training step
    sess.run(train_step, feed_dict={X: img_reshaped, Y_: label})

for i in range(100+1): 
    training_step(i, i % 50 == 0, i % 10 == 0)

结果:

    0: accuracy:1.0 loss: 2.30259
    0: ********* epoch  ********* test accuracy:1.0 test loss: 2.30259
    10: accuracy:1.0 loss: -0.0
    20: accuracy:1.0 loss: -0.0
    30: accuracy:1.0 loss: -0.0
    40: accuracy:1.0 loss: -0.0
    50: accuracy:1.0 loss: -0.0
    50: ********* epoch  ********* test accuracy:1.0 test loss: -0.0
    60: accuracy:1.0 loss: -0.0
    70: accuracy:1.0 loss: -0.0
    80: accuracy:1.0 loss: -0.0
    90: accuracy:1.0 loss: -0.0
    100: accuracy:1.0 loss: -0.0
    100: ********* epoch  ********* test accuracy:1.0 test loss: -0.0

我希望我的标签是正确的并且以正确的方式实施。另一方面,如果大家有更好的方法或发现程序中有任何错误,请随时评论。

谢谢