Нейронная сеть - мои сети, кажется, хорошо тренируются, но при классификации рапорта это совершенно случайно - PullRequest
2 голосов
/ 03 мая 2019

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

Я использую 15000 изображений из 3 классов (по 5000 в каждом) для обучения и 6000 изображений из 3 классов (по 2000 в каждом) для проверки с некоторыми дополнениями данных.

Я использую Keras с бэкэндом Tensorflow-GPU, составляю отчет о классификации и матрицу путаницы с использованием scikit-learn.Я понятия не имею, почему, когда я тренируюсь, потери и точность модели, как в обучении, так и в проверке, являются низкими / высокими соответственно, но матрица путаницы совершенно случайна.

Генераторы данных изображений

    img_width, img_height = 96, 96
    train_data_dir = 'data/train'
    validation_data_dir = 'data/validation'

    nb_train_samples = 15000
    nb_validation_samples = 6000

    epochs = 200
    batch_size = 64

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

    test_datagen = ImageDataGenerator(rescale=1./256)

    train_generator = train_datagen.flow_from_directory(train_data_dir, target_size=(
        img_width, img_height), batch_size=batch_size, class_mode='categorical', shuffle=True)
    validation_generator = test_datagen.flow_from_directory(validation_data_dir, target_size=(
        img_width, img_height), batch_size=batch_size, class_mode='categorical', shuffle=True)

Модель здания

    model = Sequential()
    model.add(Conv2D(32, (5, 5), input_shape=image_shape))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))

    model.add(Conv2D(32, (5, 5)))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))


    model.add(Flatten())
    model.add(Dense(100))
    model.add(Activation('relu'))
    model.add(Dropout(0.5))

    model.add(Dense(100))
    model.add(Activation('relu'))
    model.add(Dropout(0.5))

    model.add(Dense(3))
    model.add(Activation('softmax'))

    adam = optimizers.adam(lr=0.0016643)

    model.compile(optimizer=adam, loss='categorical_crossentropy',
                metrics=['accuracy'])

Подгонка модели

    es = keras.callbacks.EarlyStopping(
        monitor='val_loss', min_delta=0, patience=5, verbose=0, mode='auto')

    history = model.fit_generator(train_generator, steps_per_epoch=nb_train_samples//batch_size, epochs=epochs,
                                validation_data=validation_generator, validation_steps=nb_validation_samples//batch_size, callbacks=[es], use_multiprocessing=False, workers=6)

Проверка моей модели

Y_pred = model.predict_generator(
        validation_generator, steps=nb_validation_samples // batch_size)
    y_pred = np.argmax(Y_pred, axis=1)
    print('Confusion Matrix')
    cm = confusion_matrix(validation_generator.classes, y_pred)
    print(cm)
    print('Classification Report')
    target_names = ['Car', 'Bus', 'Truck']
    print(classification_report(validation_generator.classes,
                                y_pred, target_names=target_names))

Вывод, который я получаю, выглядит примерно так:

Вывод

Epoch 1/200
234/234 [==============================] - 35s 149ms/step - loss: 0.9103 - acc: 0.5645 - val_loss: 0.6354 - val_acc: 0.7419
Epoch 2/200
234/234 [==============================] - 30s 130ms/step - loss: 0.6804 - acc: 0.7181 - val_loss: 0.4679 - val_acc: 0.8117
Epoch 3/200
234/234 [==============================] - 30s 129ms/step - loss: 0.6027 - acc: 0.7573 - val_loss: 0.4401 - val_acc: 0.8238
.
.
.
Epoch 37/200
234/234 [==============================] - 30s 128ms/step - loss: 0.2667 - acc: 0.9018 - val_loss: 0.2095 - val_acc: 0.9276
Epoch 38/200
234/234 [==============================] - 30s 129ms/step - loss: 0.2711 - acc: 0.9037 - val_loss: 0.1995 - val_acc: 0.9353

##Here it breaks with an EarlyStopping

Confusion Matrix
[[659 680 661]
 [684 636 680]
 [657 658 685]]
Classification Report
              precision    recall  f1-score   support

         Car       0.33      0.33      0.33      2000
         Bus       0.32      0.32      0.32      2000
       Truck       0.34      0.34      0.34      2000

   micro avg       0.33      0.33      0.33      6000
   macro avg       0.33      0.33      0.33      6000
weighted avg       0.33      0.33      0.33      6000

dict_keys(['val_loss', 'val_acc', 'loss', 'acc'])

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...