簡體   English   中英

Tensorflow:optimizer.minimize()-“ ValueError:形狀必須為0級,但為1級

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM