Модель глубокого обучения точно не предсказывает, Керас? - PullRequest
0 голосов
/ 11 февраля 2020

Я новичок в Deep Learning и Keras. Я создал модель, которая обучается на наборе данных ASL (американский язык жестов) с почти 80 000 тренировочных изображений и 1500 тестовых изображений. Я также добавил еще несколько классов ie. Дорожные знаки от 0 до 9. Итак, всего у меня 39 классов (0-9 и АЗ). Моя задача - обучить этот набор данных и использовать его для прогнозирования. Моим входом для предсказания будет кадр с веб-камеры, где я буду отображать знак руки.

Модель My Keras

classifier = Sequential()

classifier.add(Conv2D(32, (3, 3), input_shape = (100, 100, 3), activation = 'relu'))
classifier.add(MaxPooling2D(pool_size = (2, 2)))

classifier.add(Conv2D(32, (3, 3), activation = 'relu'))
classifier.add(MaxPooling2D(pool_size = (2, 2)))

classifier.add(Flatten())

classifier.add(Dense(units = 128, activation = 'relu'))
classifier.add(Dense(units = 39, activation = 'softmax'))

classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])



from keras.preprocessing.image import ImageDataGenerator

train_datagen = ImageDataGenerator(rescale = 1./255,
                                   shear_range = 0.2,
                                   zoom_range = 0.2,
                                   horizontal_flip = True)

test_datagen = ImageDataGenerator(rescale = 1./255)

training_set = train_datagen.flow_from_directory('train',
                                                 target_size = (100,100),
                                                 batch_size = 128,
                                                 class_mode = 'categorical')

test_set = test_datagen.flow_from_directory('test',
                                            target_size = (100, 100),
                                            batch_size = 128,
                                            class_mode = 'categorical')

classifier.fit_generator(training_set,
                         steps_per_epoch = 88534,
                         epochs = 10,
                         validation_data = test_set,
                         validation_steps = 1418)

Изображения набора данных ASL имеют размер 200x200, а наборы данных с числовыми знаками имеют размер 64x64. После запуска для 5 эпок с точностью проверки 96% я все еще не могу получить хорошие прогнозы, когда я запускаю его на видео.

python программа для видеокадров

classifier = load_model('asl_original.h5')
classifier.compile(loss='binary_crossentropy',optimizer='rmsprop',metrics=['accuracy'])

cam = cv2.VideoCapture(0)

while(1):
    try:
        ret, frame = cam.read()
        frame = cv2.flip(frame,1)
        roi = frame[100:400,200:500]
        cv2.rectangle(frame,(200,100),(500,400),(0,255,0),2) 
        cv2.imshow('frame',frame) 
        cv2.imshow('roi',roi)
        img = cv2.resize(roi,(100,100))
        img = np.reshape(img,[1,100,100,3]) 
        classes = classifier.predict_classes(img)
        print(classes)

        if cv2.waitKey(1) & 0xFF == ord('q'):
            break


    except Exception:
        traceback.print_exc()
        pass

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

Ссылка для наборов данных. ASL DATASET и Знак рукой для чисел

1 Ответ

2 голосов
/ 11 февраля 2020

В файле classifier.compile вы используете loss = 'binary_crossentropy', который используется только там, где метки являются двоичными (только два класса). Если у вас есть мультиклассовая классификация, вы должны использовать соответствующую функцию потерь, основанную на количестве и типах ваших меток (например, «sparse_categorical_crossentropy»).

Попробуйте прочитать этот полезный пост в блоге, который объясняет каждый функция потерь в деталях.

...