2017-08-17 98 views
0

我試圖適應Tensorflow r0.12碼(從https://github.com/ZZUTK/Face-Aging-CAAE)到1.2.1版本,我有優化的問題.minimize()Tensorflow:optimizer.minimize() - 「ValueError異常:形狀必須是等級0,但1級

在這種情況下,我使用GradientDescent,但下面的錯誤消息是僅稍微不同(在提供形狀方面)當我嘗試不同的優化:

ValueError: Shape must be rank 0 but is rank 1 for 'GradientDescent/update_E_con 
v0/w/ApplyGradientDescent' (op: 'ApplyGradientDescent') 
with input shapes: [5,5,1,64], [1], [5,5,1,64]. 

其中[5 ,5]是我的內核大小,1是初始信道的數量和64是在第一卷積濾波器的數量,這是卷積編碼器網絡它指的是:

E_conv0: (100, 128, 128, 64) 
E_conv1: (100, 64, 64, 128) 
E_conv2: (100, 32, 32, 256) 
E_conv3: (100, 16, 16, 512) 
E_conv4: (100, 8, 8, 1024) 
E_conv5: (100, 4, 4, 2048) 
... 

這就是會引發錯誤代碼:

self.EG_optimizer = tf.train.GradientDescentOptimizer(
    learning_rate=EG_learning_rate, 
    beta1=beta1 
).minimize(
    loss=self.loss_EG, 
    global_step=self.EG_global_step, 
    var_list=self.E_variables + self.G_variables 
) 

其中:

EG_learning_rate = tf.train.exponential_decay(
    learning_rate=learning_rate, 
    global_step=self.EG_global_step, 
    decay_steps=size_data/self.size_batch * 2, 
    decay_rate=decay_rate, 
    staircase=True 
) 

self.EG_global_step = tf.get_variable(name='global_step',shape=1, initializer=tf.constant_initializer(0), trainable=False) 

而且

self.E_variables = [var for var in trainable_variables if 'E_' in var.name] 
self.G_variables = [var for var in trainable_variables if 'G_' in var.name] 

self.loss_EG = tf.reduce_mean(tf.abs(self.input_image - self.G)) 

一些調試後,我相信現在的問題來自minimize()方法。錯誤似乎是歸因於最後一個參數(var_list),但是當我嘗試註釋掉第二個或第三個參數,誤差保持不變,只是歸因於第一個參數(損失)。

我改變了目前在GitHub上的代碼以適應新版本,所以我在tf.variable_scope(tf.get_variable_scope(),reuse = True)上做了很多工作。這可能是原因嗎?

非常感謝你提前!

+0

你試過https://www.tensorflow.org/install/migration升級你的代碼? – gdelab

回答

0

是相當棘手的解碼,因爲它來自於一個內部運算,但此錯誤消息指向的原因:

ValueError: Shape must be rank 0 but is rank 1 for 'GradientDescent/update_E_conv0/w/ApplyGradientDescent' (op: 'ApplyGradientDescent') with input shapes: [5,5,1,64], 1 , [5,5,1,64].

之一輸入到ApplyGradientDescent op是秩1張量(即,矢量)它應該是一個0級張量(即標量)。望着definition of the ApplyGradientDescent op,唯一的標量輸入alpha,或學習率。

因此,看來該EG_learning_rate張量是當它應該是一個標量的向量。一個簡單的解決將是「切片」從EG_learning_rate張標,當你構建tf.train.GradientDescentOptimizer

scalar_learning_rate = EG_learning_rate[0] 

self.EG_optimizer = tf.train.GradientDescentOptimizer(
    learning_rate=scalar_learning_rate, 
    beta1=beta1 
).minimize(
    loss=self.loss_EG, 
    global_step=self.EG_global_step, 
    var_list=self.E_variables + self.G_variables 
) 
相關問題