TensorFlow - 根据另一个变量的形状动态定义变量的形状

时间:2017-08-17 15:22:51

标签: python tensorflow

假设我确定了Tensor x,其尺寸未在图初始化时定义。

我可以使用以下方式获得它的形状:

x_shape = tf.shape(input=x)

现在,如果我想根据x_shape中定义的值使用:

创建变量
y = tf.get_variable(variable_name="y", shape=[x_shape[0], 10])

我收到错误,因为传递给参数形状的值必须是int而不是Tensor。如何在不使用占位符的情况下创建这样一个动态形状的变量?

5 个答案:

答案 0 :(得分:3)

您可以使用x.get_shape()

y = tf.get_variable('y', shape=[x.get_shape()[0], 10])

答案 1 :(得分:3)

我已经没时间了,所以这很快又很脏,但也许它可以帮助你找到你的解决方案...... 它基于此(dynamic size for tf.zeros) ,但将想法扩展到tf.Variables。因为你的变量需要初始化 - 我选择0 ...

import tensorflow as tf
I1_ph = tf.placeholder(name = "I1",shape=(None,None,None),dtype=tf_dtype)

zerofill = tf.fill(tf.shape(I1_ph), 0.0)
myVar = tf.Variable(0.0)
updateMyVar = tf.assign(myVar,zerofill,validate_shape=False)

res, = sess.run([updateMyVar], { I1_ph:np.zeros((1,2,2)) } )
print ("dynamic variable shape",res.shape)

res, = sess.run([updateMyVar], { I1_ph:np.zeros((3,5,2)) } )
print ("dynamic  variable shape",res.shape)

答案 2 :(得分:2)

import tensorflow as tf

x = tf.zeros(shape=[10,20])
x_shape = x.get_shape().as_list()
y = tf.get_variable(shape=x_shape, name = 'y')

<强>更新

您无法创建未知大小的tf.Variable。例如,此代码无效:

y = tf.get_variable(shape=[None, 10], name = 'y')

答案 3 :(得分:0)

第一个参数是变量名。

x = tf.zeros(shape=[10,20])
x_shape = x.shape
variable_name ='y'
y = tf.get_variable(variable_name, shape=[x_shape[0], x_shape[1]])

答案 4 :(得分:0)

据我所知,您无法通过shape参数创建具有动态形状的变量,而是必须通过tf.Variable的初始化程序传递此动态形状。

这应该有效:

zero_init = tf.fill([x_shape[0], 10], tf.constant(0))
# Initialize
y = tf.get_variable(
    "my_var", shape=None, validate_shape=False, initializer=zero_init
)

请注意,必须在tf.Session.run(...)之前或首次执行时定义形状。因此,如果您的x是一个占位符,则需要为其提供一个值。