Tensorflow tf.data.Dataset的Efficientnet inputshape错误

Tensorflow tf.data.Dataset的Efficientnet inputshape错误,tensorflow,keras,efficientnet,Tensorflow,Keras,Efficientnet,将tf.data.Dataset馈送到train EfficientnetB0模型时,我得到以下错误: ValueError: in converted code: C:\Users\fconrad\AppData\Local\Continuum\anaconda3\envs\venv_spielereien\lib\site-packages\tensorflow_core\python\keras\engine\training_v2.py:677 map_fn b

将tf.data.Dataset馈送到train EfficientnetB0模型时,我得到以下错误:

ValueError: in converted code:

    C:\Users\fconrad\AppData\Local\Continuum\anaconda3\envs\venv_spielereien\lib\site-packages\tensorflow_core\python\keras\engine\training_v2.py:677 map_fn
        batch_size=None)
    C:\Users\fconrad\AppData\Local\Continuum\anaconda3\envs\venv_spielereien\lib\site-packages\tensorflow_core\python\keras\engine\training.py:2410 _standardize_tensors
        exception_prefix='input')
    C:\Users\fconrad\AppData\Local\Continuum\anaconda3\envs\venv_spielereien\lib\site-packages\tensorflow_core\python\keras\engine\training_utils.py:573 standardize_input_data
        'with shape ' + str(data_shape))

    ValueError: Error when checking input: expected efficientnet-b0_input to have 4 dimensions, but got array with shape (224, 224, 3)
我真想知道为什么会发生这种情况,因为当我从数据集创建批时:

train_generator = (tf.data.Dataset
                  .from_tensor_slices((train_imgs, train_labels))
                  .map(read_img)
                  .map(flip_img)
                  .map(brightness)
                  .map(blur)
                  .map(noise)
                   .map(rotate_90)
                  .repeat()
                  .shuffle(512)
                  .batch(BATCH_SIZE)
                  .prefetch(True))

validation_generator = (tf.data.Dataset
                       .from_tensor_slices((validation_imgs, validation_labels))
                       .map(read_img)
                       )

print(train_generator.__iter__().__next__()[0].shape)
我得到了预期的结果(642242243)

但在创建模型后,当我开始培训时,上面的错误会出现:

effn = tfkeras.EfficientNetB0(include_top=False, input_shape=img_shape, classes=4)
effn_model = tf.keras.Sequential()
effn_model.add(effn)
effn_model.add(tf.keras.layers.GlobalAveragePooling2D())
effn_model.add(tf.keras.layers.Dense(4, 'softmax'))

effn_model.compile(optimizer= 'adam', loss='categorical_crossentropy', metrics= ['categorical_accuracy'])

effn_model.fit(train_generator,
               epochs=20,
               steps_per_epoch=train_imgs.shape[0] // BATCH_SIZE,
               validation_data= validation_generator)
有人知道为什么数据集中的切片具有形状(64224,3),但模型无法识别批次维度吗?当我尝试训练keras.application模型时,一切都很好。 我使用tensorflow 2.1和efficientnet的pip安装。正如这里所解释的,谢谢

input\u shape
:可选的形状元组,仅在include\u top为False时指定它应该正好有3个输入通道。

因此,请尝试此->

from tensorflow.keras.applications.efficientnet import EfficientNetB0, EfficientNetB5
mm = EfficientNetB0(include_top=True, weights=None, input_tensor=None, input_shape=(128, 128, 3), pooling=None, classes=2, classifier_activation="sigmoid")
mm.summary()
注意
输入\u shape=(128,128,3)
它有3个通道。

如本文所述

input\u shape
:可选的形状元组,仅在include\u top为False时指定它应该正好有3个输入通道。

因此,请尝试此->

from tensorflow.keras.applications.efficientnet import EfficientNetB0, EfficientNetB5
mm = EfficientNetB0(include_top=True, weights=None, input_tensor=None, input_shape=(128, 128, 3), pooling=None, classes=2, classifier_activation="sigmoid")
mm.summary()
注意,
input\u shape=(128,128,3)
它有3个通道