Соответствуют ли X_train и y_train? Сверточная нейронная сеть - распознавание символов без сегментации - PullRequest
0 голосов
/ 05 мая 2020

Я пытаюсь обучить сверточную нейронную сеть для распознавания символов на изображениях. Одно изображение содержит 7 символов (0-9, AZ, пробел => 37 возможных символов). Всего 646 изображений. Эти изображения являются данными X_train.

X_train.shape
(646, 600, 1200, 1)

У меня также есть таблица со всеми метками изображений. Я закодировал эти метки горячим способом, чтобы получить массивы.

y_train.shape
(646, 7, 37)

646 - количество изображений, то есть размер строки. 7 - длина метки, размер столбца. 37 - это количество возможных символов, измерение глубины.

Я бы хотел, чтобы моя сверточная нейронная сеть автоматически распознавала символы на изображении без какой-либо сегментации или пространственной спецификации символов, как это сделали авторы в этой статье: https://ieeexplore.ieee.org/abstract/document/8078501

Теперь мне интересно, подходят ли X_train и y_train вместе для моей нейронной сети? Может быть, мне нужно изменить размер X_train или y_train, потому что, когда я запускаю этот код:

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

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

model.fit(X_train, y_train, batch_size = 32, epochs = 10, shuffle = True)

, я получил следующую ошибку:

ValueError: Error when checking target: expected dense_3 to have 2 dimensions, but got array with shape (646, 7, 37)

Спасибо за все советы!

1 Ответ

2 голосов
/ 05 мая 2020

Я переопределил сети, чтобы они соответствовали выходной форме y, я могу сказать что угодно о характеристиках

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(Lambda(lambda x: tf.expand_dims(x,1)))
model.add(Dense(64, activation = "relu"))
model.add(Dense(7, activation = "relu"))
model.add(Permute((2, 1)))
model.add(Dense(37, activation = "softmax"))

сводка:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_6 (Conv2D)            (None, 598, 1198, 32)     320       
_________________________________________________________________
max_pooling2d_6 (MaxPooling2 (None, 299, 599, 32)      0         
_________________________________________________________________
dropout_6 (Dropout)          (None, 299, 599, 32)      0         
_________________________________________________________________
flatten_5 (Flatten)          (None, 5731232)           0         
_________________________________________________________________
lambda_3 (Lambda)            (None, 1, 5731232)        0         
_________________________________________________________________
dense_15 (Dense)             (None, 1, 64)             366798912 
_________________________________________________________________
dense_16 (Dense)             (None, 1, 7)              455       
_________________________________________________________________
permute (Permute)            (None, 7, 1)              0         
_________________________________________________________________
dense_17 (Dense)             (None, 7, 37)             74        
=================================================================
...