假设我确定了Tensor x
,其尺寸未在图初始化时定义。
我可以使用以下方式获得它的形状:
x_shape = tf.shape(input=x)
现在,如果我想根据x_shape
中定义的值使用:
y = tf.get_variable(variable_name="y", shape=[x_shape[0], 10])
我收到错误,因为传递给参数形状的值必须是int
而不是Tensor
。如何在不使用占位符的情况下创建这样一个动态形状的变量?
答案 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
是一个占位符,则需要为其提供一个值。