使用 tf.keras.layers 和 keras.model

Using tf.keras.layers with 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,因为它们的 batchnormalization 层工作方式不同。这可能是将其放入我们庞大的现有代码库中的最简单方法。

我确实看到这个相关的 Whosebug post 有同样的错误:Object of Type 'Dense' has no len()

他们正确地提到这是由于 tf.keras 和 keras 不兼容。但同样,我已经确认将 tf.keras.layers 传递到 keras.applications.resnet50 确实 return 具有正确层的 keras 模型。不知何故。

你得出错误的结论,keras.applications是一个同时支持kerastf.keras包的模块,因为keras.applications使用models.Model,它检测如果您使用 tf.keraskeras 并获取相应的模块,那么代码与实际的 keras 实现无关。

keras.applications 不是混合使用 kerastf.keras,它只是支持两者。