effectivenet.tfkeras 与 tf.keras.applications.efficientnet

Tia*_*ing 3 keras tensorflow

我正在尝试使用 effectivenet 来自定义训练我的数据集。

我发现所有其他代码/数据/配置都是一样的。effectivenet.tfkeras.EfficientNetB0 可以提供约 90% 的训练/预测精度,而 tf.keras.applications.efficientnet.EfficientNetB0 只能提供约 70% 的精度。

但我想两者应该是高效网络的相同实现,或者我在这里遗漏了一些东西?

我正在使用最新的effectivenet和 Tensorflow 2.3.0

with strategy.scope():
    model = tf.keras.Sequential([
        efficientnet.tfkeras.EfficientNetB0( #tf.keras.applications.efficientnet.EfficientNetB0
            input_shape=(IMAGE_SIZE, IMAGE_SIZE, 3),
            weights='imagenet',
            include_top=False
        ),
        L.GlobalAveragePooling2D(),
        L.Dense(1, activation='sigmoid')
    ])

model.compile(
    optimizer='adam',
    loss='binary_crossentropy',
    metrics=['binary_crossentropy']
)
model.summary()
Run Code Online (Sandbox Code Playgroud)

Mar*_*zen 6

我确实在 EfficientNetB4 中遇到了同样的问题,并且确实遇到了以下问题:

  1. 总参数数量不相等。可训练参数是相等的,但不可训练参数则不同。effectivenet.tfkeras 比 tf.keras.applications 模型少了 7 个不可训练参数。

  2. 层数不相等,efficientnet.tfkeras 的层数少于 tf.keras.application 模型。

  3. 不同的层都在最开始,最值得注意的是标准化和重新缩放层,它们位于 tf.keras.applications 模型中,但不在 effectivenet.tfkeras 模型中。您可以使用model.summary()方法自己观察这一点。

  4. 当应用该层时,通过使用model.layers[i](array),结果发现这些层通过将图像除以 255 并根据以下公式应用归一化来重新缩放图像:

(输入图像 - IMAGENET_MEAN) / square_root(IMAGENET_STD)

因此,事实证明图像归一化已内置到模型中。当您自己对输入图像执行此归一化时,图像将被归一化两次,从而产生极小的像素值。因此,该模型将很难学习。

TLDR:不要标准化输入图像,因为它构建到 tf.keras.application 模型中,输入图像的值应在 0-255 范围内。