2016-11-19 43 views
2

當任何可訓練變量將「validate_shape」參數設置爲False時,Tensorflow的AdamOptimizer會爲我拋出一個錯誤。我將此參數設置爲false以允許在運行時動態批量處理。Tensorflow AdamOptimizer在變量has validate_shape = 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似乎在運行時支持動態變量形狀,但其他優化器沒有?

全REPRO於:https://github.com/narner90/scratchpad/blob/master/AdamOptimizerValidateShape.ipynb

回答

4

AdamOptimizer需要定義多個內部變量作爲其__init__函數記載:https://www.tensorflow.org/versions/r0.11/api_docs/python/train.html#AdamOptimizer

這些變量(力矩矢量)需要與變量相同的形狀,以進行更新,並可以不被動態塑造。它們通過tf.zeros初始化,它不接受未知或部分已知的形狀,因爲如果形狀未知,張量流不知道有多少元素設置爲零。即使您可以使用tf.zeros_like,但運行session.run(init_op)時,仍然需要這些零變量的完整形狀。

+0

感謝您的回覆。可以用tf.zeros_like而不是'tf.zeros'來初始化矢量矢量以在運行時支持動態大小? – narner90

+0

好點!但是,這些變量在初始化時(當你調用'session.run(init_op)')時,仍然需要一個完整的形狀,這發生在實際的'session.run'之前。所以仍然不可行。 – yuefengz