efficientnet.tfkeras 和 tf.keras.applications.efficientnet 的区别

3
我正在尝试使用efficientnet对我的数据集进行自定义训练。 我发现在所有其他代码/数据/配置相同的情况下,efficientnet.tfkeras.EfficientNetB0可以达到约90%的训练/预测准确性,而tf.keras.applications.efficientnet.EfficientNetB0仅能达到约70%的准确性。 但我猜两者应该是相同的efficient net实现,或者我在这里错过了什么? 我正在使用最新的efficientnet和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()
1个回答

6

我在EfficientNetB4上也遇到了同样的问题,遇到了以下情况:

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

  2. 层数不相等,efficientnet.tfkeras 模型比 tf.keras.applications 模型少了几层。

  3. 不同的层位于最开始的位置,其中最值得注意的是tf.keras.applications模型中的归一化和重新缩放层,并不在efficientnet.tfkeras模型中。您可以使用 model.summary() 方法自己观察到这一点。

  4. 当应用此层时,通过使用model.layers[i](array),结果这些层确实通过将其除以255并根据以下方式进行标准化来重新调整图像:

(input_image - IMAGENET_MEAN) / square_root(IMAGENET_STD)

因此,图像归一化构建在模型中。当您对输入图像执行此归一化时,图像将被归一化两次,导致极小的像素值。因此,模型将难以学习。

简而言之,不要对输入图像进行归一化,因为它已经构建在 tf.keras.application 模型中,输入图像的值应该在0-255范围内。


伟大的研究! - Tianyun Ling

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接