tf。来自输入占位符的具有动态形状的变量

时间:2018-07-27 06:46:06

标签: python python-3.x tensorflow

我正在尝试建立一个网络,我的要求是隐藏的单元形状应根据输入形状而定,以便用户可以输入任意长度的输入。我想做的是:

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以获取可变形状。

1 个答案:

答案 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]]}))