Модель прогнозирования - это только один класс из всех классов распознавания капчи - PullRequest
0 голосов
/ 14 марта 2020

Я пытаюсь создать модель для предсказания букв и цифр капчи. , но когда я пытаюсь предсказать, я обнаружил, что все предсказания приводят только к одному классу из всех классов labels=33. первая попытка от меня - использовать скорость обучения keras.optimizer.adam(lr=0.001), все прогнозы - 1, затем я попытался изменить скорость обучения до 0,01, тогда все результаты были S, как на картинке.

enter image description here

Иногда это дает

enter image description here

Я действительно не знаю, что является причиной этого , Я проверил данные. Мысль о моем разделении - это только один класс, но в моем случае это не так. Вот как я разделяю данные:

(X_train, X_test, Y_train, Y_test) = train_test_split(data, label, test_size=0.2, random_state=0)
lb = LabelBinarizer().fit(Y_train)
Y_train = lb.transform(Y_train)
Y_test = lb.transform(Y_test)

Это мои классы данных для проверки дисбаланса:

(array(['1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D',
        'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S',
        'T', 'U', 'V', 'W', 'X', 'Y', 'Z'], dtype='<U1'),
 array([8286, 6393, 6332, 6316, 6427, 6173, 6699, 6404, 6956, 6272, 6331,
        6353, 6328, 6607, 6250, 6396, 6466, 5985, 6421, 6314, 6196, 6502,
        6542, 6417, 6435, 6421, 6396, 6341, 6107, 6131, 6360, 6383, 6457]))

и затем я применил эту модель:

model=Sequential()
# First convolutional layer with max pooling
model.add(Conv2D(100, (5, 5), padding="same", input_shape=(40, 40, 1), activation="relu"))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))

# Second convolutional layer with max pooling
model.add(Conv2D(200, (5, 5), padding="same", activation="relu"))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
# Second convolutional layer with max pooling
model.add(Conv2D(200, (5, 5), padding="same", activation="relu"))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
# Hidden layer with 500 nodes
model.add(Flatten())
model.add(Dense(500, activation="relu"))
model.add(Dense(33, activation="softmax"))

# Ask Keras to build the TensorFlow model behind the scenes
optimizer = keras.optimizers.adam(lr=0.01)
model.compile(loss="categorical_crossentropy", optimizer=optimizer, metrics=["accuracy"])

model.fit(X_train, Y_train, validation_data=(X_test, Y_test), batch_size=128, epochs=10, verbose=1)

Я думаю о:

проблема расщепления? выпечка? ошибка кода? Я запускаю модель в зависимости от модели этого примера здесь:

ссылка модели кода

Я заблокирован в этой части около 1 недели и не сделал ' найти решение

1 Ответ

2 голосов
/ 14 марта 2020

Когда я вижу ваш случай и ваш код, я думаю о двух проблемах:

  1. Прежде всего, вы сначала уравняли свои данные, чтобы получить одинаковое количество образцов для каждого класса, в тренировочном наборе? Несбалансированные данные могут дать плохие результаты. Сколько образцов в классе у вас есть в тренировочном наборе?

  2. Почему бы вам сначала не проанализировать ярлыки на всем столбце ярлыков? Это правда, что вы используете один и тот же ярлык как для Y_train, так и для Y_test, но что если у вас отсутствуют классы в наборе тестов? (эта проблема связана с вышеупомянутой).

Безопаснее делать следующее, особенно после балансировки данных:

lb = LabelBinarizer()
lb_label = lb.fit_transform(label)
(X_train, X_test, Y_train, Y_test) = train_test_split(data, lb_label, test_size=0.2, random_state=0)

В ваших примерах я вижу, что у вас есть двусмысленность между B и 6 и S и другими символами. Кажется, что модель не подходит.

Ваши классы не скаляры, а векторы, поэтому размер выходного слоя должен быть двухмерным, может быть (1, 33).

Размер вашего Conv2D должен быть все меньше и меньше в архитектуре CNN, но у вас есть 100, 200, 200, 500, изменение этого может помочь улучшить ваш счет , тоже.

Надеясь, что это может помочь.

ОБНОВЛЕНИЕ

Вы также можете использовать ЭТИ АРХИТЕКТУРЫ в Керасе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...