Я сгенерировал набор данных, используя EMNIST, который имеет один символ на изображение или два символа на изображение. Размер изображения составляет 28x56 (hxw)
Я в основном хочу предсказать один или два символа в данное изображение. Я не уверен, на какой архитектуре следовать, чтобы реализовать это. Существует 62 класса символов.
пример: - один символ два символа
Для одного символа y = [23]
Для двух символов y = [35,11]
Я попробовал следующее.
- Я попытался реализовать этот полный CT C, но я застрял в бесконечной потере, которая Я не смог исправить.
- Заполнил единичные истинные символы с помощью 62, чтобы отметить пустой символ, и обучил CNN со следующими слоями.
print ()
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
y_train = sequence.pad_sequences(y_train, padding='post', value = 62)
y_test = sequence.pad_sequences(y_test,padding='post', value = 62)
X_train = X_train/255.0
X_test = X_test/255.0
input_shape = (28, 56, 1)
model = Sequential()
model.add(Conv2D(filters=72, kernel_size=(11,11), padding = 'same', activation='relu',input_shape=input_shape))
model.add(MaxPooling2D(pool_size=(2,2),strides=2))
model.add(Conv2D(filters=144, kernel_size=(7,7) , padding = 'same', activation='relu'))
model.add(Conv2D(filters=144, kernel_size=(3,3) , padding = 'same', activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Flatten())
model.add(Dense(units=1024, activation='relu'))
model.add(Dropout(.5))
model.add(Dense(512, activation='relu'))
model.add(Dense(units=2, activation='relu'))
model.compile(loss='mse', optimizer='adam', metrics=['accuracy'])
model.summary()
batch_size = 128
steps = math.ceil(X_train.shape[0]/batch_size)
datagen = ImageDataGenerator(
featurewise_center=False, # set input mean to 0 over the dataset
samplewise_center=False, # set each sample mean to 0
featurewise_std_normalization=False, # divide inputs by std of the dataset
samplewise_std_normalization=False, # divide each input by its std
zca_whitening=False, # apply ZCA whitening
rotation_range=0, # randomly rotate images in the range (degrees, 0 to 180)
zoom_range = 0.2, # Randomly zoom image
width_shift_range=0.2, # randomly shift images horizontally (fraction of total width)
height_shift_range=0.1, # randomly shift images vertically (fraction of total height)
horizontal_flip=False, # randomly flip images
vertical_flip=False)
history = model.fit_generator(datagen.flow(X_train,y_train, batch_size=batch_size),
epochs = 6, validation_data = (X_test, y_test),
verbose = 1,steps_per_epoch=steps)
Мне удалось достичь точности около 90% для набора проверки. Однако, когда я передаю сгенерированное изображение, чтобы увидеть его прогноз, это несколько символов от правильной классификации. Что-то не так в том, как я создал модель или предварительно обработал данные?