Как установить фильтры для сверточной нейронной сети - PullRequest
0 голосов
/ 20 апреля 2019

Я пытаюсь построить мультиклассовый классификатор изображений, используя keras cnn. Мой размер ввода изображений (256,256) пикселей. Но вместо этого я использовал (128,128), так как обработка (256,256) пиксельных изображений займет много времени. Но когда я тестирую сеть с помощью тестового набора, я едва достигаю 50% точности, хотя я получаю 97% точности во время обучения. Я думаю, что есть проблема с фильтрами или количеством слоев. Может кто-нибудь объяснить, как повысить эффективность моего классификатора на основе CNN.

Я пытался изменить количество эпох, я использовал входную форму как (64,64), но они производят небольшие эффекты.

... enter code here

from keras.models import Sequential
from keras.layers import Conv2D
from keras.layers import MaxPooling2D
from keras.layers import Dense
from keras.layers import Flatten
from keras.layers import Dropout
import os


classifier = Sequential()

classifier.add(Conv2D(64,(3,3), input_shape = (128,128,3), activation = "relu"))

classifier.add(Conv2D(64,(3,3), input_shape = (128,128,3), activation = "relu"))

classifier.add(Conv2D(32,(3,3), input_shape = (128,128,3), activation = "relu"))

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



classifier.add(Flatten())
classifier.add(Dropout(0.5))
classifier.add(Dense(units= 64, activation = "relu"))

classifier.add(Dense(units= 6, activation = "softmax"))

classifier.compile(optimizer = "adam", loss = "categorical_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("/home/user/Documents/final_year_project/dataset/training",
target_size = (128,128),
batch_size = 50,
class_mode="categorical")

test_set = test_datagen.flow_from_directory(
"/home/user/Documents/final_year_project/dataset/testing/",
target_size = (128,128),
batch_size = 32,
class_mode="categorical")


from IPython.display import display
from PIL import Image

classifier.fit_generator(training_set, steps_per_epoch=98, epochs=18)

target_dir = '/home/user/Documents/model'
if not os.path.exists(target_dir):
os.mkdir(target_dir)
classifier.save('/home/user/Documents/model/model.h5')
classifier.save_weights('/home/user/Documents/model/weights.h5')

print("Training Completed!!")

1 Ответ

0 голосов
/ 20 апреля 2019

Есть несколько очевидных улучшений (для меня), которые вы можете сделать:

Измените размер партии на 2 ** n (то есть 2 на степень 5: batch_size = 32).

input_shape зарезервировано только для вашего входного слоя (первый сверточный слой).

classifier = Sequential()

# Add extraction layers.
classifier.add(Conv2D(64,(3,3), input_shape = (128,128,3), 
               activation="relu"))
classifier.add(Conv2D(64,(3,3), activation="relu"))
classifier.add(MaxPooling2D(pool_size = (2,2)))     # <= this may help as well
classifier.add(Conv2D(32,(3,3), activation="relu"))
classifier.add(Conv2D(32,(3,3), activation="relu"))
classifier.add(MaxPooling2D(pool_size = (2,2)))

# Add classifier layers.
classifier.add(Flatten()) 
classifier.add(Dropout(0.5))        # might be too big, can try 0.2
classifier.add(Dense(units=64, activation="relu"))
classifier.add(Dense(units=6, activation="softmax"))

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

НАИБОЛЕЕ ВАЖНО: Добавьте данные проверки к вашей тренировке. Соотношение обучения и валидации составляет примерно 80: 20.

fit_generator(
    generator,              # *
    steps_per_epoch=None,   # **
    epochs=20,
    verbose=1,
    callbacks=None,
    validation_data=None,   # same format as training generator *
    validation_steps=None,  # same format as steps_per_epoch    **
    class_weight=None,
    max_queue_size=10,
    workers=1,
    use_multiprocessing=False,
    shuffle=True,
    initial_epoch=0
)
...