在tensorflow中输入一个带占位符的整数?

Input an integer with placeholder in tensorflow?

我想在 Tensorflow 中输入一个 batch_size 整数作为占位符。但它不作为一个整数。考虑以下示例:

import tensorflow as tf


max_length = 5
batch_size = 3

batch_size_placeholder = tf.placeholder(dtype=tf.int32)

mask_0 = tf.one_hot(indices=[0]*batch_size_placeholder, depth=max_length, on_value=0., off_value=1.)
mask_1 = tf.one_hot(indices=[0]*batch_size, depth=max_length, on_value=0., off_value=1.)

# new session
with tf.Session() as sess:
    feed = {batch_size_placeholder : 3}

    batch, mask0, mask1 = sess.run([
                     batch_size_placeholder, mask_0, mask_1
    ], feed_dict=feed)

当我打印 batchmask0mask1 的值时,我有以下内容:

print(batch)
>>> array(3, dtype=int32)

print(mask0)
>>> array([[0., 1., 1., 1., 1.]], dtype=float32)

print(mask1)
>>> array([[0., 1., 1., 1., 1.],
           [0., 1., 1., 1., 1.],
           [0., 1., 1., 1., 1.]], dtype=float32)

确实我以为mask0mask1一定是一样的,但是好像Tensorflow并没有把batch_size_placeholder当成一个整数。我相信它会是一个张量,但无论如何我可以在我的计算中将它用作整数吗?

有什么方法可以解决这个问题吗?仅供参考,我使用 tf.one_hot 作为示例,我想在我的代码训练期间 运行 train/validation,我将需要许多其他计算 batch_size 在训练和验证步骤中。

如有任何帮助,我们将不胜感激。

在纯 python 用法中,[0]*3 将是 [0,0,0]。但是,batch_size_placeholder 是一个占位符,在图形执行期间,它将是一个张量。 [0]*tensor 将被视为张量乘法。在您的情况下,它将是一个具有 0 值的一维张量。要正确使用 batch_size_placeholder,您应该创建一个与 batch_size_placeholder.

具有相同长度的张量
mask_0 = tf.one_hot(tf.zeros(batch_size_placeholder, dtype=tf.int32), depth=max_length, on_value=0., off_value=1.)

它的结果与mask_1相同。

一个简单的例子来说明区别。

batch_size_placeholder = tf.placeholder(dtype=tf.int32)

a = [0]*batch_size_placeholder
b = tf.zeros(batch_size_placeholder, dtype=tf.int32)
with tf.Session() as sess:
    print(sess.run([a, b], feed_dict={batch_size_placeholder : 3}))

# [array([0], dtype=int32), array([0, 0, 0], dtype=int32)]