当变量具有validate_shape = False时,Tensorflow AdamOptimizer会抛出错误

时间:2016-11-19 22:57:52

标签: python machine-learning tensorflow

当任何可训练的变量具有" validate_shape"时,Tensorflow的AdamOptimizer会给我一个错误。参数设置为False。我将此参数设置为false以允许在运行时动态批量大小。

~/anaconda/lib/python3.5/site-packages/tensorflow/python/framework/tensor_shape.py in as_list(self)
    774     """
    775     if self._dims is None:
--> 776       raise ValueError("as_list() is not defined on an unknown TensorShape.")
    777     return [dim.value for dim in self._dims]
    778 

ValueError: as_list() is not defined on an unknown TensorShape.

我无法使用GradientDescentOptimizer重现此错误,但Tensorflow中的所有其他优化器都会抛出相同的错误。

opt = tf.train.AdamOptimizer()

X = tf.placeholder(tf.float64, shape=[None, None], name='X')
Y = tf.placeholder(tf.float64, shape=[None, 1], name='Y')
B = tf.Variable(initial_value=tf.zeros([tf.shape(X)[1], 1], dtype=tf.float64), validate_shape=False, name='B')

prediction = tf.matmul(X, B)
loss = tf.reduce_sum((Y- prediction) ** 2)
opt_op = opt.minimize(loss)

为什么GradientDescentOptimizer似乎在运行时支持动态变量形状,但其他优化器不支持?

完全重复:https://github.com/narner90/scratchpad/blob/master/AdamOptimizerValidateShape.ipynb

1 个答案:

答案 0 :(得分:4)

__init__需要定义几个内部变量,如tf.zeros函数中所述:the docs

这些变量(力矩向量)需要相同的形状,并且要更新变量并且不能动态塑造。它们是通过tf.zeros_like初始化的,它不接受未知或部分已知的形状,因为如果形状未知,张量流不知道要设置为零的元素数量。即使您可以使用session.run(init_op)代替,运行soup = BeautifulSoup(html, 'lxml') text = soup.get_text(strip=True, separator=' ') print(text) 时仍然需要这些零变量的完整形状。