Ошибка значения: неопределенность кардинальности данных: (Jupyter Notebook)

Вопрос или проблема

Я создаю OCR для считывания текста со счетчиков воды. Я сталкиваюсь с указанной выше ошибкой, когда пытаюсь подогнать модель машинного обучения. Я использую библиотеку Python segmentation_models.

BACKBONE = 'resnet34'
preprocess_input = sm.get_preprocessing(BACKBONE)



x_train, y_train, x_val, y_val = train_test_split(X,y, test_size = 0.2, random_state= 12345)


x_train = preprocess_input(x_train)
x_val = preprocess_input(x_val)

model = sm.Unet(BACKBONE, encoder_weights="imagenet", encoder_freeze=True)
model.compile('Adam', 
   loss=sm.losses.bce_jaccard_loss,
   metrics=[sm.metrics.iou_score])

model.fit(
   x = x_train,
   y = y_train,
   batch_size=16,
   epochs=10,
   validation_data=(x_val, y_val))

‘X’ представляет изображения, а ‘y’ представляют маски; оба имеют по 1244 изображения.

Полная ошибка:

ValueError: Амбивалентность кардинальности данных:
размеры x: 995
размеры y: 249
Убедитесь, что все массивы содержат одинаковое количество образцов.

Пожалуйста, дайте знать, если нужно опубликовать больше информации. Я не часто использую эту платформу.

Эта ошибка вызвана тем, что вы неправильно используете train_test_split. Функция возвращает массивы в следующем порядке: arr1_train, arr1_test, arr2_train, arr2_test и так далее. Это означает, что в вашем примере вы присваиваете значения вашего набора данных X_train переменной y_train и используете его, как будто они содержат информацию о метках. Правильный способ использования функции train_test_split — изменить порядок имен переменных в соответствии с документацией:

x_train, x_val, y_train, y_val = train_test_split(X, y, test_size = 0.2, random_state= 12345)

Ответ или решение

Ошибка ValueError: Data cardinality is ambiguous возникает из-за несоответствия размеров массивов x и y, передаваемых в метод .fit() вашей модели. В вашем случае сообщения об ошибке указывает, что размеры x (995) и y (249) не совпадают, что и вызывает эту ошибку.

Давайте разберёмся, почему это происходит. Вы используете функцию train_test_split, но, похоже, неправильно задали порядок переменных. Эта функция возвращает разделённые данные в следующем порядке: массивы для обучающего и тестового наборов. У вас должна быть следующая структура:

x_train, x_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=12345)

Таким образом, чтобы исправить вашу ошибку, измените порядок инициализации переменных в своём коде, как показано выше. Это обеспечит, что y_train и y_val правильно будут содержать разметку (маски) для соотвествующих изображений (массивов x_train и x_val).

Вот исправленный фрагмент кода:

import segmentation_models as sm
from sklearn.model_selection import train_test_split

BACKBONE = 'resnet34'
preprocess_input = sm.get_preprocessing(BACKBONE)

# Правильный порядок переменных в train_test_split
x_train, x_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=12345)

x_train = preprocess_input(x_train)
x_val = preprocess_input(x_val)

model = sm.Unet(BACKBONE, encoder_weights="imagenet", encoder_freeze=True)
model.compile('Adam', 
   loss=sm.losses.bce_jaccard_loss,
   metrics=[sm.metrics.iou_score])

model.fit(
   x=x_train,
   y=y_train,
   batch_size=16,
   epochs=10,
   validation_data=(x_val, y_val))

Убедитесь, что X (изображения) и y (маски) имеют одинаковое количество образцов до использования train_test_split, поскольку это требование для корректного выполнения модели.

Если после внесения указанных изменений проблема не исчезнет, пожалуйста, проверьте, чтобы массивы X и y корректно загружались и содержали одинаковое количество элементов перед разделением.

Если у вас остались вопросы или возникли новые ошибки, не стесняйтесь задавать.

Оцените материал
Добавить комментарий

Капча загружается...