2017-08-17 299 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 
) 
相关问题