【问题标题】:incompatible shapes with model.fit与 model.fit 不兼容的形状
【发布时间】:2021-09-07 09:20:21
【问题描述】:

我遇到了无法追踪的不兼容形状错误。我正在尝试使用此处提供的代码:https://data-flair.training/blogs/face-mask-detection-with-python/,我正在研究 google colab。我在第 5 步,使用 model.fit_generator() 训练模型,这是 [10,2] 与 [10,3] 错误发生的地方,使用 fit() 得到相同的错误。

据我所知,[10,2] 来自我正在使用的模型,我使用最后一个 Dense 层设置模型的形状,但我不确定 [10,3] 在哪里来自,我感觉它与train_datagen或train_generator有关,但我一直无法弄清楚。

这是我当前的代码,我做了一些更改,但错误与我使用提供的代码得到的错误相同:

from tensorflow.keras.optimizers import RMSprop
from tensorflow.keras.preprocessing.image import ImageDataGenerator
import cv2
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, Input, ZeroPadding2D, BatchNormalization, Activation, MaxPooling2D, Flatten, Dense,Dropout
from tensorflow.keras.models import Model, load_model
from tensorflow.keras.callbacks import TensorBoard, ModelCheckpoint
from sklearn.model_selection import train_test_split
from sklearn.metrics import f1_score
from sklearn.utils import shuffle
import imutils
import numpy as np

#Conv and MaxPool layers extract features from dataset,
#Flatten and Dropout layers convert data in 1d and ensure overfitting
#2 dense layers for classification

#groups a linear stack of layers into a tf.keras.Model
#Conv2D: 2d convulation layer(spatial convolution over images)
#provide keyword argument input_shape

model = Sequential([ #
    Conv2D(100, (3,3), activation='relu', input_shape=(150, 150, 3)),
    #input_shape of photos will be (150,150), color photos so 3 channels
    MaxPooling2D(2,2),
    
    Conv2D(100, (3,3), activation='relu'),
    MaxPooling2D(2,2),
    
    Flatten(), #flattens data into a single array
    Dropout(0.5), #randomly sets '0.5' of inputs to 0
    Dense(50, activation='relu'), # model outputs arrays of shape(none,50)
    Dense(2, activation='softmax') # model outputs arrays of shape(none,2)
])

model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['acc'])
#print(model.summary())
#print(model.output_shape)

TRAINING_DIR = "./train"
train_datagen = ImageDataGenerator(rescale=1.0/255,
                                   rotation_range=40,
                                   width_shift_range=0.2,
                                   height_shift_range=0.2,
                                   shear_range=0.2,
                                   zoom_range=0.2,
                                   horizontal_flip=True,
                                   fill_mode='nearest')
#print(train_datagen.data_format)
train_generator = train_datagen.flow_from_directory(TRAINING_DIR, 
                                                    batch_size=10, 
                                                    target_size=(150, 150))

#print(train_generator.image_shape)
VALIDATION_DIR = "./test"
validation_datagen = ImageDataGenerator(rescale=1.0/255)

validation_generator = validation_datagen.flow_from_directory(VALIDATION_DIR, 
                                                         batch_size=10, 
                                                         target_size=(150, 150))

#callback checkpoint, saves best model after each epoch while training
checkpoint = ModelCheckpoint('model2-{epoch:02d}.model',
                             monitor='val_loss',
                             verbose=1,
                             save_best_only=True,
                             mode='auto')
#print(checkpoint.model.output_shape())

print()
#print(checkpoint.shape())
#train model here, with fit_generator
history = model.fit(train_generator,
                    epochs=10,
                    validation_data=validation_generator,
                    callbacks=[checkpoint])

这是错误。

Found 1315 images belonging to 3 classes.
Found 194 images belonging to 3 classes.

Epoch 1/10
---------------------------------------------------------------------------
InvalidArgumentError                      Traceback (most recent call last)
<ipython-input-61-06d6f3664a3f> in <module>()
     74                     epochs=10,
     75                     validation_data=validation_generator,
---> 76                     callbacks=[checkpoint])

6 frames
/usr/local/lib/python3.7/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: [10,3] vs. [10,2]
     [[node binary_crossentropy/logistic_loss/mul (defined at <ipython-input-61-06d6f3664a3f>:76) ]] [Op:__inference_train_function_36488]

Function call stack:
train_function

错误说它是第 76 行的检查点参数,但我很确定它与第 71 行的 train_generator 参数有关,因为除非我修改该参数,否则错误不会改变。

将最后一个 Dense 层更改为 3 会使错误消失,因为我很确定 2 与蒙版是打开还是关闭有关,添加第三个选项会使后面的步骤中的逻辑混乱。

我想知道错误中的 [10,3] 和 [10,2] 到底指的是什么。

【问题讨论】:

    标签: python machine-learning keras google-colaboratory training-data


    【解决方案1】:

    我检查了问题中给出的链接,似乎该项目致力于检测一个人是否戴着口罩。所以这是一个二元分类。所以模型的输出形状应该是(10, 2),其中 10 是批量大小,3 是类数。

    正如您在代码输出中看到的,训练和测试生成器说他们找到了3 类。所以生成器会生成形状为 (10,3) 的张量,其中 10 是批量大小,3 是类数。

    Found 1315 images belonging to 3 classes.
    Found 194 images belonging to 3 classes.
    

    所以这是错误的来源。

    作为一个解决方案,我建议检查这些目录./train./test 是否每个只包含两个 文件,每个文件对应一个类。

    --train
        -----mask
        -----no mask
    --test
        -----mask
        -----no mask
    

    【讨论】:

      猜你喜欢
      • 2020-10-03
      • 2020-11-16
      • 1970-01-01
      • 2021-12-31
      • 2019-12-16
      • 2021-09-18
      • 2021-06-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多