Недавно я построил простую сверточную нейронную сеть для распознавания жестов рук, используя вычитание фона, чтобы сделать руку белой фигурой на экране с черным фоном. Он был построен с использованием Keras Conv2D по большей части. В моем наборе данных 1000 изображений для обучения и 100 изображений для проверки и тестирования. Как ни странно, проблема возникает сразу после первой эпохи, когда потеря модели значительно снижается. Обычно оно уменьшается с некоторого большого числа, такого как 183, до 1 в начале второй эпохи. Все фотографии из набора данных с моей стороны, использующие cv2, но я проводил тестирование только своей рукой, так что проблем не должно быть. В случае, если с набором данных возникла проблема, я попытался взять 3 разных набора данных, один из которых использовал метод Canny cv2, который по существу отслеживает линию руки и делает оставшуюся часть пи c черным, чтобы увидеть, имеет ли это значение. Несмотря на это, то же самое продолжало происходить. Кроме того, я добавил несколько слоев Dropout в разных местах, чтобы увидеть эффект, и всегда происходит одно и то же, в котором потери резко уменьшаются, и это показывает признаки переоснащения. Я также реализовал EarlyStopping и несколько слоев, чтобы посмотреть, помогло ли это, но, похоже, всегда происходят одни и те же результаты.
model = Sequential()
model.add(Conv2D(32, (3,3), activation = 'relu',
input_shape = (240, 215, 1)))
model.add(MaxPooling2D((2,2)))
model.add(Dropout(0.25))
model.add(Conv2D(64, (3,3), activation = 'relu'))
model.add(Conv2D(64, (3,3), activation = 'relu'))
model.add(MaxPooling2D((2,2)))
model.add(Dropout(0.25))
model.add(Conv2D(128, (3,3), activation = 'relu'))
model.add(MaxPooling2D((2,2)))
model.add(Dropout(0.25))
model.add(Conv2D(256, (3,3), activation = 'relu'))
model.add(MaxPooling2D((2,2)))
model.add(Dropout(0.25))
#model.add(Conv2D(256, (3,3), activation = 'relu'))
#model.add(MaxPooling2D((2,2)))
#model.add(Conv2D(128, (3,3), activation = 'relu'))
#model.add(MaxPooling2D((2,2)))
#model.add(Conv2D(64, (3,3), activation = 'relu'))
#model.add(MaxPooling2D((2,2)))
model.add(Flatten())
model.add(Dense(150, activation = 'relu'))
#model.add(Dropout(0.25))
#model.add(Dense(1000, activation = 'relu'))
model.add(Dropout(0.75))
model.add(Dense(6, activation = 'softmax'))
model.summary()
model.compile(optimizer = 'adam', loss = 'categorical_crossentropy',
metrics = ['acc'])
callbacks_list = [EarlyStopping(monitor = 'val_loss', patience = 10),
ModelCheckpoint(filepath = 'model.h6', monitor = 'val_loss',
save_best_only = True),]
Комментируемые разделы кода - это изменения, которые я пытался реализовать. Я также сильно изменил значения Dropout и их позиции, и ничего существенного не изменилось. Может ли кто-нибудь дать совет, почему моя модель так быстро подходит?