Вопрос или проблема
Я создаю 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
корректно загружались и содержали одинаковое количество элементов перед разделением.
Если у вас остались вопросы или возникли новые ошибки, не стесняйтесь задавать.