Tensorflow 2.2.0 InvalidArgumentError: Incompatible shapes: [98,2] vs. [32,2]

Tensorflow 2.2.0 InvalidArgumentError: Incompatible shapes: [98,2] vs. [32,2]

我正在尝试使用数据扩充构建性别 class化模型(2 classes)。

我的数据包含 2 个名为 'men' 和 'women' 的文件夹,共有 3339 张图像。 数据路径 = 'data/' 在数据文件夹中,我有两个名为 men 和 women 的 class 文件夹。

这是我的模型和模型摘要:

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

你每张图的形状好像是(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'))