在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)
当我打印 batch
、mask0
和 mask1
的值时,我有以下内容:
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)
确实我以为mask0
和mask1
一定是一样的,但是好像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)]
我想在 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)
当我打印 batch
、mask0
和 mask1
的值时,我有以下内容:
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)
确实我以为mask0
和mask1
一定是一样的,但是好像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)]