![](/img/trans.png)
[英]TensorFlow Recommenders - ValueError: Shape must be rank 2 but is rank 3
[英]Tensorflow: optimizer.minimize() - "ValueError: Shape must be rank 0 but is rank 1
我正在尝试将Tensorflow r0.12代码(来自https://github.com/ZZUTK/Face-Aging-CAAE )改编为1.2.1版,并且Optimizer.minimize()存在问题。
在这种情况下,我使用的是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))
经过一些调试后,我现在认为问题出在minimal()方法上。 该错误似乎归因于最后一个参数(var_list),但是当我尝试注释掉第二个或第三个参数时,该错误保持不变,而仅归因于第一个参数(损失)。
我已经针对当前GitHub上的代码进行了更改,以使其适应新版本,因此我在tf.variable_scope(tf.get_variable_scope(),复用= True)上做了很多工作。 这可能是原因吗?
提前非常感谢您!
解码很棘手,因为它来自内部操作,但是此错误消息指出了原因:
ValueError:形状必须为等级0,但对于'GradientDescent / update_E_conv0 / w / ApplyGradientDescent'(op:'ApplyGradientDescent'),输入形状为[5,5,1,64], 1 、、 [5,5,1 ,64]。
ApplyGradientDescent
op的输入之一是等级1张量(即向量),而它应该是等级0张量(即标量)。 查看ApplyGradientDescent
op的定义 ,唯一的标量输入是alpha
或学习率。
因此,当EG_learning_rate
张量应该是标量时,它似乎是一个向量。 一个简单的解决方法是在构造tf.train.GradientDescentOptimizer
时从EG_learning_rate
张量“缩放”标量:
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
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.