На ваших предыдущих слоях есть много обычно используемых архитектур, которые вы можете попытаться получить с большей точностью в своем наборе данных.
На плотных слоях есть несколько способов решения этой проблемы. Поскольку существует максимум 8 символов с 37 возможными символами каждый. Вы можете иметь последний слой как model.add(Dense(37*8, activation = "sigmoid"))
с пороговым значением 0,5, чтобы обозначить все 37 * 8 возможностей.
model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3), input_shape = (600, 1200, 1), activation = "relu"))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(64, activation = "relu"))
model.add(Dense(37*8, activation = "relu"))
Более подходящим способом было бы иметь 9 выходных слоев: один с 8 нейронами для обозначения присутствия символа и другие 8 слоев с 37 нейронами каждый с softmax для обозначения того, что это за символ. Обратите внимание, что для этого вы должны использовать функциональный API вместо последовательного API.
Пример:
inp = Input(shape=(600,1200,1))
X = Conv2D(32, kernel_size=(3, 3), activation = "relu")(inp)
X = MaxPooling2D(pool_size=(2, 2))(X)
X = Dropout(0.25)(X)
X = Flatten()(X)
X = Dense(64, activation = "relu")(X)
P = Dense(8, activation = "relu")(X)
C1 = Dense(37, activation = "softmax")(X)
...
C8 = Dense(37, activation = "softmax")(X)
model = Model(inp, [P,C1,C2,...C8])