首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Tensorflow: optimizer.minimize() - "ValueError:形状必须为0级,但为1级

Tensorflow: optimizer.minimize() - "ValueError:形状必须为0级,但为1级
EN

Stack Overflow用户
提问于 2017-08-17 03:13:33
回答 1查看 2.3K关注 0票数 0

我正在尝试将Tensorflow r0.12代码(从https://github.com/ZZUTK/Face-Aging-CAAE)调整到1.2.1版本,并且我对optimizer.minimize()有问题。

在本例中,我使用的是GradientDescent,但是当我尝试使用不同的优化器时,下面的错误消息(就所提供的形状而言)只是略有不同:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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是第一次卷积中的滤波器数。这是它所指的卷积编码器网络:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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)
...

这是触发错误的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
)

其中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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)上做了大量工作。这可能是原因吗?

提前谢谢你!

EN

回答 1

Stack Overflow用户

发布于 2017-08-21 07:01:27

解码是很困难的,因为它来自内部操作,但此错误消息指出了原因:

'GradientDescent/update_E_conv0/w/ApplyGradientDescent‘(op:'ApplyGradientDescent')的输入形状: 5,5,1,64,1,5,5,1,64。

ApplyGradientDescent op的输入之一是秩1张量(即向量),而它应该是秩0张量(即标量)。看看操作,唯一的标量输入是alpha,或者是学习速率。

因此,当EG_learning_rate张量应该是标量时,它似乎是一个向量。一个简单的解决方法是在构造EG_learning_rate张量时从tf.train.GradientDescentOptimizer张量中“切片”一个标量。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45733581

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文