Tensorflow上两层训练神经模型的预测

时间:2017-12-07 18:44:14

标签: python tensorflow prediction

我在Tensor上使用经过训练的神经模型进行预测时遇到了麻烦。这是我的尝试:

import tensorflow as tf
import pandas, numpy as np
dataset=[[0.4,0.5,0.6,0],[0.6,0.7,0.8,1],[0.3,0.8,0.5,2],....]

X = tf.placeholder(tf.float32, [None, 3])
W = tf.Variable(tf.zeros([3,10]))
b = tf.Variable(tf.zeros([10]))

Y1 = tf.matmul(X, W) + b

W1 = tf.Variable(tf.zeros([10, 1]))
b1 = tf.Variable(tf.zeros([1]))
Y = tf.nn.sigmoid(tf.matmul(Y1, W1) + b1)

# placeholder for correct labels
Y_ = tf.placeholder(tf.float32, [None, 1])
init = tf.global_variables_initializer()
# loss function


cross_entropy = -tf.reduce_sum(Y_ * tf.log(Y))
optimizer = tf.train.GradientDescentOptimizer(0.003)
train_step = optimizer.minimize(cross_entropy)


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

for i in range(1000):
    # load batch of images and correct answers
    batch_X, batch_Y = [x[:3] for x in dataset[:4000]],[x[-1:] for x in dataset[:4000]]
    train_data={X: batch_X, Y_: batch_Y}
    sess.run(train_step, feed_dict=train_data)

correct_prediction = tf.equal(tf.argmax(Y,1), tf.argmax(Y_,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
a,c = sess.run([accuracy, cross_entropy], feed_dict=train_data)

test, lebs=[x[:3] for x in dataset[4000:]],[x[-1:] for x in dataset[4000:]]
test_data={X: test, Y_: lebs}                                           
a,c = sess.run([accuracy, cross_entropy], feed_dict=test_data)
prediction=tf.argmax(Y,1)
print ("predictions", prediction.eval({X:test}, session=sess))

当我运行上面的代码时,我得到了以下结果:

predictions [0 0 0 ..., 0 0 0]

我的预期输出应该是班级标签:

predictions `[0,1,2....]`

我将非常感谢您的建议。

1 个答案:

答案 0 :(得分:1)

您的代码存在多个问题:

初始化:初始化体重变量为零。

W = tf.Variable(tf.zeros([3,10]))

如果您对所有类型的输入进行零初始化,那么您的模型将在每一层都保持相同的值。用随机值初始化它。例如:

W = tf.Variable(tf.truncated_normal((3,10)))

损失函数:我相信你试图将这个熟悉的等式复制为你的损失函数: y * log(prob) + (1 - y) * log(1 - prob)。我相信你已经完成了10门课程。对于10个类中的每个类,您将必须替换上述等式并记住,您将在上面的等式中使用y值作为正确的类或错误的类,即仅针对每个类的1或0。不要将y值替换为0到9之间的类标签。

为避免所有这些计算,我建议您使用Tensorflow的内置函数,如tf.nn.softmax_cross_entropy_with_logits。它将在很长一段时间内为您提供帮助。

Sigmoid功能这是为什么你的所有输出都只给出0 的价值的罪魁祸首。 sigmoid的输出范围是0到1.考虑用ReLU替换它。

输出单位:如果您正在进行分类,最终图层中的神经元数量应等于类别数。每个类表示一个输出类。用10个神经元替换它。

学习率:继续使用您的学习率。我相信对于这么小的网络来说,你的学习率还不高。

希望您了解代码中的问题。请谷歌上面提到的每一点我都提到了更多细节,但我已经给了你足够的信息来开始解决这个问题。