2017-07-03 64 views
0

为什么x需要是float?为什么不能这样做int因为我传递了一个类型的列表int为什么这个tf.placeholder是一个浮点数?

代码:

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 

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

+0

输入以'train_data = range(1,10000,1) – Bosen

回答

1

这是由于tf.nn.softmax_cross_entropy_with_logits

logits and labels must have the same shape [batch_size, num_classes] and the same dtype (either float16, float32, or 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")