InvalidArgumentError:不兼容的形状:[29] 与 [29,7,7,2]

Posted

技术标签:

【中文标题】InvalidArgumentError:不兼容的形状:[29] 与 [29,7,7,2]【英文标题】:InvalidArgumentError: Incompatible shapes: [29] vs. [29,7,7,2] 【发布时间】:2021-12-31 15:00:50 【问题描述】:

所以我在这里和 Python 也是新手。我正在尝试建立自己的网络。我找到了一些 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

【问题讨论】:

【参考方案1】:

您需要在某处展平您的预测,否则您将输出图像(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()

【讨论】:

以上是关于InvalidArgumentError:不兼容的形状:[29] 与 [29,7,7,2]的主要内容,如果未能解决你的问题,请参考以下文章

keras 分割 InvalidArgumentError:不兼容的形状:[32,256,256,3] 与 [32,256,256,4]

InvalidArgumentError:当前图与来自检查点的图不匹配

InvalidArgumentError:无法将张量添加到批次:元素数量不匹配。形状是:[张量]:[4],[批次]:[5] [Op:IteratorGetNext]

我不明白出了啥问题 InvalidArgumentError: Conv2DCustomBackpropInputOp only support NHWC

InvalidArgumentError:预期维度在 [-1, 1) 范围内,但得到 1

InvalidArgumentError:重塑的输入是一个178802值的张量,但请求的形状有89401