为什么这个tf.placeholder必须是浮动的?

时间:2017-07-03 08:41:19

标签: machine-learning tensorflow

x 为什么需要浮动?为什么它不能 int ,因为我传递的是类型为int的列表

代码:

x = tf.placeholder(tf.float32, shape=[None, 1])  # Why must this be a float?
y = tf.placeholder(tf.int32, shape=[None, 2])

with tf.name_scope("network"):
    layer1 = tf.layers.dense(x, 100, activation=tf.nn.relu, name="hidden_layer")
    output = tf.layers.dense(layer1, 2, name="output_layer")

with tf.name_scope("loss"):
    xentropy = tf.nn.softmax_cross_entropy_with_logits(labels=y, logits=output)
    loss = tf.reduce_mean(xentropy, name="loss")

with tf.name_scope("train"):
    optimizer = tf.train.AdamOptimizer()
    training_op = optimizer.minimize(loss)

with tf.name_scope("eval"):
    with tf.Session() as sess:
        for i in range(1, 50):
            sess.run(tf.global_variables_initializer())
            saver = tf.train.Saver()
            sess.run(training_op, feed_dict={x: np.array(train_data).reshape([-1, 1]), y: label})
            if i % 10 == 0:
                saver.save(sess, "saved_models/testing")
                print "Saved"

当我将其更改为tf.int32时,会出现以下错误:

TypeError: Value passed to parameter 'features' has DataType int32 not in list of allowed values: float16, float32, float64

如果需要,我可以提供更多代码。

1 个答案:

答案 0 :(得分:3)

这是由于tf.nn.softmax_cross_entropy_with_logits

  

logits和label必须具有相同的形状[batch_size,num_classes]和相同的dtype(float16,float32或float64)。

我想你可能计算整数输入的损失。但是,大多数情况下,这种损失通过梯度下降最小化 - 就像你那样 - 这意味着输入需要编码实数以获得任意更新。

问题是tf.layers.dense不会改变输入的类型。所以它会产生一个整数输出,它的输入是一个整数。 (至少如果激活与整数兼容,例如relu - sigmoid会引发错误。)

您可能想要做的是提供整数输入然后按照tf.float32进行所有计算。要执行此操作,请先将输入转换为dense

layer1 = tf.layers.dense(tf.to_float(x), 100, activation=tf.nn.relu, name="hidden_layer")