Многоканальная сверточная нейронная сеть - PullRequest
1 голос
/ 02 мая 2020

Я разрабатываю сверточную нейронную сеть для классификации изображений или лучше для классификации номерных знаков. Эти номерные знаки содержат до 8 символов, и для каждого символа возможно 37 символов (AZ, 0-9 и пробел). Теперь мне интересно, как спроектировать два последних слоя в моей сети. Я думаю, последним должен быть слой softmax с 37 вероятностями. Это должно быть полностью связано с одним (?) Нейроном в слое раньше? Я думаю, что в слое раньше нам нужно 8 нейронов из-за 8 символов в номерном знаке раньше, но я не уверен здесь. Перед этим слоями я добавляю несколько сверточных слоев и слоев maxPooling. Это правильный подход или у вас есть другие предложения?

Я написал этот код:

from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D

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(8, activation = "relu"))
model.add(Dense(37, activation = "softmax"))

model.compile(optimizer="rmsprop", loss="categorical_crossentropy", metrics=["accuracy"])

Особенно в отношении слоев после моего Flatten Layer Я действительно не уверен ... Есть кто-то кто может помочь? Надеюсь, я правильно описал свою проблему ...

1 Ответ

1 голос
/ 05 мая 2020

На ваших предыдущих слоях есть много обычно используемых архитектур, которые вы можете попытаться получить с большей точностью в своем наборе данных.

На плотных слоях есть несколько способов решения этой проблемы. Поскольку существует максимум 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])
...