InvalidArgumentError: Incompatible shapes: [29] vs. [29,7,7,2]

InvalidArgumentError: Incompatible shapes: [29] vs. [29,7,7,2]

所以我是这里和 Python 的新人。我正在尝试建立自己的网络。我找到了一些 docs 和 cats 15x15 的图片,不幸的是无法制作这个基本网络...

所以,这些是我正在使用的库

    from tensorflow.keras.models import Sequential
    from tensorflow.keras import utils
    from tensorflow.keras.datasets import mnist  
    from tensorflow.keras.layers import Dense
    import numpy as np
    import matplotlib.pyplot as plt
    import tensorflow as tf
    import keras
    from tensorflow.keras.layers import Conv2D
    from tensorflow.keras.layers import MaxPooling2D
    from tensorflow.keras.layers import GlobalMaxPooling2D

正文

train_dataset = tf.keras.preprocessing.image_dataset_from_directory(
        'drive/MyDrive/cats vs dogs/cats vs dogs/training',
        color_mode="rgb",
        batch_size=32,
        image_size=(150, 150),
        shuffle=True,
        seed=42,
        validation_split=0.1,
        subset='training',
        interpolation="bilinear",
        follow_links=False,
        )

validation_dataset = tf.keras.preprocessing.image_dataset_from_directory(
    'drive/MyDrive/cats vs dogs/cats vs dogs/training',
    color_mode="rgb",
    batch_size=32,
    image_size=(150, 150),
    shuffle=True,
    seed=42,
    validation_split=0.1,
    subset='validation',
    interpolation="bilinear",
    follow_links=False,
    )
test_dataset = tf.keras.preprocessing.image_dataset_from_directory(
    'drive/MyDrive/cats vs dogs/cats vs dogs/test',
     batch_size = 32,
     image_size = (150, 150),
     interpolation="bilinear"
     )

model = Sequential()
model.add(keras.Input(shape=(150, 150, 3)))
model.add(Conv2D(32, 5, strides=2, activation="relu"))
model.add(Conv2D(32, 3, activation="relu"))
model.add(MaxPooling2D(3))
model.add(Dense(250, activation='sigmoid'))
model.add(Dense(100))
model.add(MaxPooling2D(3))
model.add(Dense(2))
model.summary()

model.compile(loss='binary_crossentropy', 
          optimizer='adam',
          metrics=['accuracy'])

history = model.fit(train_dataset, validation_data=validation_dataset, epochs=5, verbose=2)

我收到这个错误

Incompatible shapes: [29] vs. [29,7,7,2]
 [[node gradient_tape/binary_crossentropy/mul_1/BroadcastGradientArgs
 (defined at /usr/local/lib/python3.7/dist-packages/keras/optimizer_v2/optimizer_v2.py:464)
 ]] [Op:__inference_train_function_4364]

 Errors may have originated from an input operation.
 Input Source operations connected to node 
 gradient_tape/binary_crossentropy/mul_1/BroadcastGradientArgs:
 In[0] gradient_tape/binary_crossentropy/mul_1/Shape:   
 In[1] gradient_tape/binary_crossentropy/mul_1/Shape_1

我试图从 binary_crossentropy 更改为 categorical_crossentrapy 但它没有帮助,我想我的错误在于数据集或输入但我不知道如何解决它:(

真心希望能在这里得到帮助!

[我的架构][1] [1]: https://i.stack.imgur.com/w4Y9N.png

您需要在某处展平您的预测,否则您将输出一张图像(29 个大小为 7x7 的样本,具有 2 个通道),而您只需要一个平坦的二维 logits(所以形状为 29x2)。您使用的架构有点奇怪,您的意思是在第一个密集层 之前 进行展平操作,然后没有“maxpooling2d”(因为展平信号没有意义)?混合 relu 和 sigmoid 激活也是非常不标准的,我鼓励您从已建立的架构开始,而不是尝试编写自己的架构以获得一些直觉。

model = Sequential()
model.add(keras.Input(shape=(150, 150, 3)))
model.add(Conv2D(32, 5, strides=2, activation="relu"))
model.add(Conv2D(32, 3, activation="relu"))
model.add(MaxPooling2D(3))
model.add(Flatten())
model.add(Dense(250, activation="relu"))
model.add(Dense(100, activation="relu"))
model.add(Dense(2))
model.summary()