KeyError:'优化器无法识别变量dense_1/kernel:0。用于预训练的 keras 模型 VGG19

she*_*hey 3 deep-learning tensorflow pre-trained-model tensorflow2.0

我使用以下代码加载 imagenet 预训练的 VGG19 模型并适合我的自定义数据集。

from keras.applications.vgg19 import VGG19


optim = tf.keras.optimizers.RMSprop(momentum=0.9)
vgg19 = VGG19(include_top=False, weights='imagenet', input_tensor=tf.keras.layers.Input(shape=(224, 224, 3)))
vgg19.trainable = False
# x = keras.layers.GlobalAveragePooling2D()(model_vgg19_pt.output)
x = keras.layers.Flatten()(vgg19.output)
output = keras.layers.Dense(n_classes, activation='softmax')(x)
model_vgg19_pt = keras.models.Model(inputs=[vgg19.input], outputs=[output])
model_vgg19_pt.compile(optimizer=optim,
                       loss='categorical_crossentropy', metrics=['categorical_accuracy'])
callback = tf.keras.callbacks.LearningRateScheduler(scheduler)
model_vgg19_pt.fit(x_train, y_train, batch_size=20,
                             epochs=50, callbacks=[callback]
                             )

Run Code Online (Sandbox Code Playgroud)

在 model.fit() 行上,出现以下错误

KeyError:'优化器无法识别变量dense_1/kernel:0。这通常意味着您尝试调用优化器来分别更新模型的不同部分。请optimizer.build(variables)在训练循环之前调用可训练变量的完整列表,或使用旧版优化器“tf.keras.optimizers.legacy.{self. 班级姓名}。'

这是什么意思以及如何解决它?

我得到同样的错误

keras.applications.inception_v3
Run Code Online (Sandbox Code Playgroud)

当使用相同的实现方法时也是如此。

此外,这是在tensorflow cpu上使用jupyter笔记本文件,但是当在安装了tensorflow-gpu的远程计算机上运行时,我收到这些错误。

这适用于优化器 SGD,但不适用于 RMSprop。为什么?

附加 使用这个:

model_vgg19_pt.compile(optimizer=tf.keras.optimizers.RMSprop(momentum=0.9),
                           loss='categorical_crossentropy', metrics=['categorical_accuracy'])
Run Code Online (Sandbox Code Playgroud)

相反,如上面使用的作品。但有人可以解释一下为什么......

nir*_*ran 8

使用遗留优化器

 tf.keras.optimizers.legacy.SGD(learning_rate=0.1)
Run Code Online (Sandbox Code Playgroud)