我正在尝试建立一个网络,我的要求是隐藏的单元形状应根据输入形状而定,以便用户可以输入任意长度的输入。我想做的是:
import tensorflow as tf
n_hidden_1=100
input_ = tf.placeholder(name='input_data',shape=[None,None],dtype=tf.float32)
variable_data = tf.Variable(tf.random_normal([tf.shape(input_)[1], n_hidden_1]))
bias_ = tf.Variable(tf.random_normal([n_hidden_1]))
output = tf.matmul(input_,variable_data)+bias_
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print(sess.run(output,feed_dict={input_:[[1,2,3,4,5]]}))
我想要
variable_data = tf.Variable(tf.random_normal([tf.shape(input_)[1], n_hidden_1]))
shape,但是给出了错误。这就是为什么我尝试这种方法的原因:
variable_data = tf.Variable(tf.random_normal([tf.shape(input_)[1], n_hidden_1]),validate_shape=False)
但是随后我又遇到了另一个错误:
InvalidArgumentError: You must feed a value for placeholder tensor 'input_data_7' with dtype float and shape [?,?]
[[Node: input_data_7 = Placeholder[dtype=DT_FLOAT, shape=[?,?], _device="/job:localhost/replica:0/task:0/device:CPU:0"]()]]
如何从占位符获取shape int以获取可变形状。
答案 0 :(得分:2)
tf.Variable
不能真正具有动态形状,因为它对它们的目的没有意义。在张量流中,变量是指通常由SGD优化的模型参数。在优化过程中,您通常会假设成本函数及其定义的空间在每一步都不会变化。不这样做(尤其是以随机的,非计划的方式)会导致定义不明确的优化问题。
但是,可以要做的是有一个变量,当第一个示例出现时,我们在运行时将其(静态)形状的定义推迟。您几乎在那里:您只需要将示例提供给global_variables_initializer
,该示例会将变量初始化为正确的形状和值:
import tensorflow as tf
n_hidden_1=100
input_ = tf.placeholder(name='input_data',shape=[None,None],dtype=tf.float32)
variable_data = tf.Variable(tf.random_normal([tf.shape(input_)[1], n_hidden_1]), validate_shape=False)
bias_ = tf.Variable(tf.random_normal([n_hidden_1]))
output = tf.matmul(input_,variable_data)+bias_
with tf.Session() as sess:
sess.run(tf.global_variables_initializer(), feed_dict={input_:[[1,2,3,4,5]]})
print(sess.run(output, feed_dict={input_:[[1,2,3,4,5]]}))