即使具有高精度,神经网络也能给出错误和变化的答案

时间:2017-06-29 05:52:36

标签: python neural-network deep-learning

我为notMNIST数据集写了一个网,其中包含来自A-J的灰度28 * 28字母。

模型在测试数据集上的准确度为89%,但是当我从列车数据集中检查单个图像的结果时(甚至没有谈到自定义图像),它会给出错误的结果,如果我一次又一次地运行相同的代码块,结果因单个输出而异。

我必须在这里做错事,但我刚开始深入学习。

我的模型 - >

batch_size = 128
#tensorflow datasets
tf_train_dataset = tf.placeholder(tf.float32, shape=(batch_size, image_size*image_size))
tf_train_labels = tf.placeholder(tf.float32, shape=(batch_size, num_labels))
tf_valid_dataset = tf.constant(valid_dataset)
tf_test_dataset = tf.constant(test_dataset)
#weights and biases for layer 1
weights_l1 = tf.Variable(
    tf.truncated_normal([image_size*image_size, 1024])
)
biases_l1 = tf.Variable(
    tf.zeros([1024])
)
#output layer weights and biases
weights = tf.Variable(
    tf.truncated_normal([1024, num_labels])
)
biases = tf.Variable(
    tf.zeros([num_labels])
)

hl1 = tf.matmul(tf_train_dataset, weights_l1) + biases_l1
hl1 = tf.nn.relu(hl1)

logits = tf.matmul(hl1, weights) + biases

loss = tf.reduce_mean(
    tf.nn.softmax_cross_entropy_with_logits(labels=tf_train_labels, logits=logits)
)


optimizer = tf.train.GradientDescentOptimizer(0.05).minimize(loss)

#validation predictions
v_hl1 = tf.matmul(tf_valid_dataset, weights_l1) + biases_l1
v_hl1 = tf.nn.relu(v_hl1)
v_logits = tf.matmul(v_hl1, weights) + biases
#test predictions
t_hl1 = tf.matmul(tf_test_dataset, weights_l1) + biases_l1
t_hl1 = tf.nn.relu(t_hl1)
t_logits = tf.matmul(t_hl1, weights) + biases

train_prediction = tf.nn.softmax(logits)
valid_prediction = tf.nn.softmax(v_logits)
test_prediction = tf.nn.softmax(t_logits)

训练步骤 - >

num_steps = 3001

with tf.Session() as session:
    tf.global_variables_initializer().run()
    for step in range(num_steps):
        offset = (step*batch_size) % (train_labels.shape[0]-batch_size)
        feed_dict = {tf_train_dataset: train_dataset[offset: offset+batch_size, :], 
                     tf_train_labels: train_labels[offset: offset+batch_size, :]
                    }
        _, l, predictions = session.run([optimizer, loss, train_prediction], feed_dict=feed_dict)
        if(step%500 == 0):
            print ('minibatch no.', step)
            print ('current loss', l)
            print("Minibatch accuracy: %.1f%%" % accuracy(predictions, train_labels[offset: offset+batch_size, :]))
            print("Validation accuracy: %.1f%%" % accuracy(valid_prediction.eval(), valid_labels))
    print("Test accuracy: %.1f%%" % accuracy(test_prediction.eval(), test_labels))

输出 - >

minibatch no。 0 目前亏损351.531 迷你精度:7.8% 验证准确度:27.7% 小批量没有。 500 目前亏损6.78443 迷你精度:82.0% 验证准确率:81.9% 小批量没有。 1000 当前亏损6.5816 迷你精度:80.5% 验证准确率:81.9% 小批量没有。 1500 目前亏损4.70451 迷你精度:81.2% 验证准确率:82.4% 小批量没有。 2000 目前亏损3.25759 迷你精度:84.4% 验证准确度:79.1% 小批量没有。 2500 目前亏损4.18851 迷你精度:82.8% 验证准确度:81.6% 小批量没有。 3000 当前亏损2.84338 迷你精度:86.7% 验证准确度:83.0% 测试精度:89.0%

测试图像 - >

(假设图片是' F')

image_file = 'EE.png'
image_data = (ndimage.imread(image_file).astype(float) - 
                    pixel_depth / 2) / pixel_depth
new_image_data = image_data.reshape([1, 784])
new_image_data = tf.convert_to_tensor(new_image_data)
new_image_data = tf.cast(new_image_data, dtype=tf.float32)
answer = tf.matmul(new_image_data, weights_l1) + biases_l1
answer = tf.nn.relu(answer)
answer = tf.matmul(answer, weights) + biases
answer = tf.nn.softmax(answer)
with tf.Session() as sess:
    tf.global_variables_initializer().run()
    print(sess.run(answer))

由于

1 个答案:

答案 0 :(得分:1)

使用此代码,您可以将网络重新初始化为随机值,然后尝试解决您的图像输入问题。

with tf.Session() as sess:
    tf.global_variables_initializer().run()
    print(sess.run(answer))

以下代码生成所需的输出:

logits.eval(feed_dict={tf_train_dataset:answer})

您可以在测试和验证集上重复使用变量进行计算。您不必使用新的张量。如果要使用不同的变量,则需要访问相同的变量。我恳请您完成tensorflow主页提供的标准MNIST教程,以了解基本概念。

如果您不需要理解这些概念,我可以指向keras(https://keras.io/),这是tensorflow的包装器,它隐藏了这种复杂性。