Я хочу классифицировать рисунок по изображению.Моя исходная форма изображения 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, когда мы увидим размер моего набора данных?