CNN на маленьком наборе данных перевыполняет - PullRequest
0 голосов
/ 02 мая 2019

Я хочу классифицировать рисунок по изображению.Моя исходная форма изображения 200 000 * 200 000, я изменил его до 96 * 96, рисунок до сих пор можно узнать человеческими глазами.Значение пикселя равно 0 или 1.

Я использую следующую нейронную сеть.


train_X, test_X, train_Y, test_Y = train_test_split(cnn_mat, img_bin["Classification"], test_size = 0.2, random_state = 0)

class_weights = class_weight.compute_class_weight('balanced',
                                                 np.unique(train_Y),
                                                 train_Y)


train_Y_one_hot = to_categorical(train_Y)
test_Y_one_hot = to_categorical(test_Y)

train_X,valid_X,train_label,valid_label = train_test_split(train_X, train_Y_one_hot, test_size=0.2, random_state=13)


    model = Sequential()
    model.add(Conv2D(24,kernel_size=3,padding='same',activation='relu',
            input_shape=(96,96,1)))
    model.add(MaxPool2D())
    model.add(Conv2D(48,kernel_size=3,padding='same',activation='relu'))
    model.add(MaxPool2D())
    model.add(Conv2D(64,kernel_size=3,padding='same',activation='relu'))
    model.add(MaxPool2D())
    model.add(Flatten())
    model.add(Dense(128, activation='relu'))
    model.add(Dense(256, activation='relu'))
    model.add(Dense(16, activation='softmax'))
    model.compile(optimizer="adam", loss="categorical_crossentropy", metrics=["accuracy"])

train = model.fit(train_X, train_label, batch_size=80,epochs=20,verbose=1,validation_data=(valid_X, valid_label),class_weight=class_weights)

Я уже провел некоторый эксперимент, чтобы найти «хорошее» количество скрытых слоев и полностью подключенныхслой.Вероятно, это не самая оптимальная архитектура, поскольку мой компьютер работает медленно, я просто один раз запустил другую модель и выбрал лучшую с путаницей матриц, я не использовал перекрестную проверку, Я не пробовал более сложную архитектуру, так как число моихданных мало, я читал маленькую архитектуру, лучше всего, стоит ли попробовать более сложную архитектуру?

здесь результат с 5 и 12 эпохами, размер баха 80. Это матрица путаницы длямой набор тестов

Как вы можете видеть, это выглядит так, будто я переигрываю.Когда я запускаю только 5 эпох, большая часть класса назначается классу 0;С большим количеством эпох класс 0 менее важен, но классификация все еще плоха

Я добавил 0,8 отсева после каждого сверточного слоя

например,

    model.add(Conv2D(48,kernel_size=3,padding='same',activation='relu'))
    model.add(MaxPool2D())
    model.add(Dropout(0.8))
    model.add(Conv2D(64,kernel_size=3,padding='same',activation='relu'))
    model.add(MaxPool2D())
    model.add(Dropout(0.8))

С выпадением 95%моего изображения классифицированы в классе 0.

Я попробовал увеличить изображение;Я сделал ротацию всего своего тренировочного образа, все еще использовал взвешенную функцию активации, результат не улучшился. Стоит ли увеличивать только класс с небольшим количеством изображений?Большая часть того, что я читаю, говорит об увеличении всего набора данных ...

Чтобы возобновить мой вопрос: я должен попробовать более сложную модель?

Полезно ли делать увеличение изображениятолько на непредставленный класс?тогда я должен все еще использовать весовой класс (я думаю, нет)?

Должен ли я надеяться найти "хорошую" модель с cnn, когда мы увидим размер моего набора данных?

Ответы [ 2 ]

2 голосов
/ 02 мая 2019

Я думаю, что в соответствии с несбалансированными данными, лучше создать собственный генератор данных для вашей модели, чтобы каждый из генерируемых им пакетов данных содержал хотя бы одну выборку из каждого класса. А также лучше использовать слой Dropout после каждого слоя dense вместо слоя conv. Для увеличения данных лучше использовать комбинацию поворота, горизонтального и вертикального переворота. Существуют и другие подходы к увеличению данных, например, использование GAN сети или случайная замена пикселей. Для Gan вы можете проверить Это ТАК сообщение

Для использования Gan в качестве дополнителя данных вы можете прочитать Эта статья . Для комбинации увеличения уровня пикселей и GAN увеличения данных уровня пикселей

1 голос
/ 02 мая 2019

То, что я использовал - в других настройках - было для повышения моих данных с ADASYN. Этот алгоритм вычисляет количество новых данных, необходимых для баланса ваших классов, а затем использует доступные данные для выборки новых примеров.

Существует реализация для Python . В противном случае у вас также очень мало данных. SVM хорошо работают даже при небольшом количестве данных. Возможно, вы захотите попробовать их или другие алгоритмы классификации изображений в зависимости от того, где ожидаемый шаблон всегда находится на одной и той же позиции или меняется. Тогда вы также можете попробовать инфраструктуру обнаружения объектов Viola – Jones.

...