ValueError: найден массив с dim 3. Ожидается оценщик <= 2. (Keras, Sklearn) - PullRequest
0 голосов
/ 30 марта 2020

Я пытаюсь обучить модель, используя этот код из учебника Адриана Роузброка, используя мой собственный набор данных для определения выражения лица эмоции.

INIT_LR = 1e-3
EPOCHS = 30
BS = 10

print("[INFO] loading images...")
imagePaths = list(paths.list_images(args["dataset"]))
data = []
labels = []


for imagePath in imagePaths:
# extract the class label from the filename
    label = imagePath.split(os.path.sep)[-2]


    image = cv2.imread(imagePath)
    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    image = cv2.resize(image, (48, 48))

    data.append(image)
    labels.append(label)
data = np.array(data) / 255.0
labels = np.array(labels)

# perform one-hot encoding on the labels
lb = LabelBinarizer()
labels = lb.fit_transform(labels)
labels = to_categorical(labels)

(trainX, testX, trainY, testY) = train_test_split(data, labels,
test_size=0.20, stratify=labels, random_state=42) # line 80

trainAug = ImageDataGenerator(
   rotation_range=15,
   fill_mode="nearest")
baseModel = VGG16(weights="imagenet", include_top=False,
input_tensor=Input(shape=(48, 48, 3)))

headModel = baseModel.output
headModel = AveragePooling2D(pool_size=(4, 4))(headModel)
headModel = Flatten(name="flatten")(headModel)
headModel = Dense(64, activation="relu")(headModel)
headModel = Dropout(0.5)(headModel)
headModel = Dense(7, activation="softmax")(headModel)


model = Model(inputs=baseModel.input, outputs=headModel)

for layer in baseModel.layers:
layer.trainable = False

print("[INFO] compiling model...")
opt = Adam(lr=INIT_LR, decay=INIT_LR / EPOCHS)
model.compile(loss="categorical_crossentropy", optimizer=opt,
metrics=["accuracy"])
print("[INFO] training head...")
H = model.fit_generator(

trainAug.flow(trainX, trainY, batch_size=BS),
steps_per_epoch=len(trainX) // BS,
validation_data=(testX, testY),
validation_steps=len(testX) // BS,
epochs=EPOCHS) # InvalidArgumentError : Incompatible shapes

Этот код работал для двух классов (двоичная классификация) , Я хотел бы сделать этот скрипт обучающим набором данных из 7 классов. Я внес некоторые изменения, но когда я выполнил этот код, я получил эту ошибку:

[INFO] загрузка изображений ...

Traceback (последний вызов был последним):

Файл "train_mask.py", строка 80, в

test_size = 0,20, стратификация = метки, random_state = 42), в check_array

% (array.ndim, estimator_name))

ValueError: Найденный массив с dim 3. Ожидается оценщик <= 2. </p>

Что мне нужно сделать, чтобы этот код работал для классификации Multilabel, а не для двоичной классификации?

1 Ответ

1 голос
/ 30 марта 2020

Обычно параметр стратификации принимает массив страт или меток, а не метки с горячим кодированием.

Если убрать стратификацию, она запустится? Если это так, просто удалите, создайте переменную, такую ​​как hotlabels, чтобы вы не перезаписывали исходный массив меток.

Это зависит от используемой вами функции train_test_split. Если это scikit, то это должен быть массив меток.

https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html

...