【问题标题】:Tensorflow 2.2.0 InvalidArgumentError: Incompatible shapes: [98,2] vs. [32,2]Tensorflow 2.2.0 InvalidArgumentError:不兼容的形状:[98,2] vs. [32,2]
【发布时间】:2020-07-10 16:11:24
【问题描述】:

我正在尝试使用数据增强来构建性别分类模型(2 类)。

我的数据包含 2 个文件夹,分别名为“男人”和“女人”,共有 3339 张图像。 数据路径 = '数据/' 在数据文件夹中,我有两个名为 men 和 women 的类文件夹。

这是我的模型和模型总结:

model = Sequential()

model.add(Conv2D(filters=32, kernel_size=(5,5), padding='same', kernel_initializer='he_normal', input_shape=(128,128,3)))
model.add(Activation('relu'))
model.add(Conv2D(filters=32, kernel_size=(5,5), padding='same', kernel_initializer='he_normal'))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.25))

model.add(Conv2D(filters=64, kernel_size=(5,5), padding='same', kernel_initializer='he_normal'))
model.add(Activation('relu'))
model.add(Conv2D(filters=64, kernel_size=(5,5), padding='same', kernel_initializer='he_normal'))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.25))

model.add(Flatten())

model.add(Dense(units=256, activation='relu'))
model.add(Dense(units=num_classes, activation='sigmoid'))

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

hist = model.fit(datagen.flow(x_train, y_train, batch_size=32),
                 epochs=30,
                 steps_per_epoch=x_train.shape[0]//32,
                 validation_data=(x_test,y_test),
                 validation_steps=x_test.shape[0]//32,
                 verbose=1,
                 callbacks=callbacks)

模型总结:

Model: "sequential_5"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_17 (Conv2D)           (None, 128, 128, 32)      2432      
_________________________________________________________________
activation_16 (Activation)   (None, 128, 128, 32)      0         
_________________________________________________________________
conv2d_18 (Conv2D)           (None, 128, 128, 32)      25632     
_________________________________________________________________
activation_17 (Activation)   (None, 128, 128, 32)      0         
_________________________________________________________________
max_pooling2d_8 (MaxPooling2 (None, 64, 64, 32)        0         
_________________________________________________________________
dropout_8 (Dropout)          (None, 64, 64, 32)        0         
_________________________________________________________________
conv2d_19 (Conv2D)           (None, 64, 64, 64)        51264     
_________________________________________________________________
activation_18 (Activation)   (None, 64, 64, 64)        0         
_________________________________________________________________
conv2d_20 (Conv2D)           (None, 64, 64, 64)        102464    
_________________________________________________________________
activation_19 (Activation)   (None, 64, 64, 64)        0         
_________________________________________________________________
max_pooling2d_9 (MaxPooling2 (None, 32, 32, 64)        0         
_________________________________________________________________
dropout_9 (Dropout)          (None, 32, 32, 64)        0         
_________________________________________________________________
flatten_4 (Flatten)          (None, 65536)             0         
_________________________________________________________________
dense_8 (Dense)              (None, 256)               16777472  
_________________________________________________________________
dense_9 (Dense)              (None, 2)                 514       
=================================================================
Total params: 16,959,778
Trainable params: 16,959,778
Non-trainable params: 0

我的训练和测试数据形状:

x_train.shape = (3005, 224, 224, 3)
x_test.shape = (334, 224, 224, 3)
y_train.shape = (3005, 2)
y_test.shape = (334, 2)

以下错误:

Epoch 1/30

---------------------------------------------------------------------------

InvalidArgumentError                      Traceback (most recent call last)

<ipython-input-42-f9e107b66258> in <module>()
     13                  validation_steps=x_test.shape[0]//32,
     14                  verbose=1,
---> 15                  callbacks=callbacks)

8 frames

/usr/local/lib/python3.6/dist-packages/tensorflow/python/eager/execute.py in quick_execute(op_name, num_outputs, inputs, attrs, ctx, name)
     58     ctx.ensure_initialized()
     59     tensors = pywrap_tfe.TFE_Py_Execute(ctx._handle, device_name, op_name,
---> 60                                         inputs, attrs, num_outputs)
     61   except core._NotOkStatusException as e:
     62     if name is not None:

InvalidArgumentError:  Incompatible shapes: [98,2] vs. [32,2]
     [[node gradient_tape/binary_crossentropy/logistic_loss/mul/BroadcastGradientArgs (defined at <ipython-input-42-f9e107b66258>:15) ]] [Op:__inference_train_function_5749]

Function call stack:
train_function

【问题讨论】:

    标签: python tensorflow tensorflow2.0


    【解决方案1】:

    您的每个图像的形状似乎都是 (224,224,3),并且您将 (128,128,3) 指定为 input_shape。这可能是问题吗? 如果没有,您能否分享定义 x_train 和 x_test 的代码? 另外,请注意,为二进制分类器定义具有 sigmoid 激活的二维输出似乎不正确。我要么有一个带有 sigmoid 激活的单元(最常见的场景),要么使用 softmax 激活。

    model.add(Dense(units=1, activation='sigmoid'))
    
    或者
    model.add(Dense(units=num_classes, activation='softmax'))
    

    【讨论】:

    • 我不知道我怎么没注意到形状,实际上我改变了训练形状但我忘了改变模型中的形状,我的错。也是的,在这里使用 softmax 会更合乎逻辑,我认为我们对二进制类 (2) 使用 sigmoid。
    • 当然,对于二进制类,如果指定单个单元,则可以使用 sigmoid。在这种情况下,模型输出其中一类的概率,即 1 - 输出训练实例属于另一类的概率。如果您使用具有两个单元的 softmax 激活,则两个输出将被归一化以加起来为 1,并且一个神经元将输出 1 - 另一个。这种方法将参数添加到您的模型中,但实际上并没有什么不同,所以我建议不要这样做。很高兴您解决了您的问题!
    • 酷,也可以代替二元交叉熵,使用分类交叉熵更合乎逻辑吧?
    • 好点。实际上,如果您输出多个单元,您可能应该对此类问题使用分类交叉熵损失。
    猜你喜欢
    • 2019-10-20
    • 1970-01-01
    • 2021-06-23
    • 2021-08-05
    • 2019-08-29
    • 2021-12-31
    • 2021-09-18
    • 2021-06-11
    • 1970-01-01
    相关资源
    最近更新 更多