首页 > 解决方案 > 将 tf.keras.layers 与 keras.model 一起使用

问题描述

是的,我到处都读到 keras 和 tf.keras 不兼容。但是您可以将 tf.keras.layers 传递给 keras 模型,它确实有效。当我尝试用自己的模型做到这一点时......它不起作用!

如果您检查 Resnet50.py 的 resnet 源代码,他们会构建类似的模型

input = layers.Input(shape=input_shape)
x = layers.Dense()(x)
model = Model(input,x)

无论您传入 layers=tf.keras.layers 还是 layers=keras.layers 都可以正常工作

演示代码:

import tensorflow as tf
import keras

# THIS WORKS!
input_shape = (224,224,3)
base_model = keras.applications.ResNet50(layers=tf.keras.layers, weights='imagenet',
                  weights='imagenet', include_top=False, pooling=None,
                  input_shape=input_shape,
                  classes=1000)

# this fails!!
input = tf.keras.layers.Input(shape=input_shape)
x = tf.keras.layers.Dense(1000,activation='relu')(input)
model = keras.Model(input, x)

我的代码产生了这个错误:类型错误:Dense 类型的对象没有 len

如何使我的这项工作?显然有一种方法可以使它工作,因为 keras.applications 预建模型似乎确实支持它并且工作正常

我想使用 tf.keras.layers 因为它们的批标准化层工作方式不同。这可能是将其放入我们庞大的现有代码库中的最简单方法。

我确实看到这个相关的 stackoverflow 帖子具有相同的错误:“密集”类型的对象没有 len()

他们正确地提到这是由于 tf.keras 和 keras 不兼容。但我再次确认,将 tf.keras.layers 传递给 keras.applications.resnet50确实会返回具有正确层的 keras 模型。不知何故。

标签: kerastensorflow2.0tf.keras

解决方案


你得到了错误的结论,keras.applications是一个同时支持kerastf.keras包的模块,作为keras.applicationsuses models.Model,它检测你是否使用tf.kerasorkeras并获取相应的模块,因此代码与实际的 keras 实现无关。

keras.applications没有混合使用kerasand tf.keras,它只支持两者。


推荐阅读