В настоящее время я работаю над моделью CNN, которая классифицирует изображения продуктов питания. До сих пор мне удалось построить функционирующую Си-Эн-Эн, но я хотел бы улучшить точность. Для набора данных я использовал несколько изображений из Kaggle и несколько из моей собственной коллекции.
Вот некоторая информация о наборе данных:
- Есть 91 класс изображений еды.
- В каждом классе содержится от 500 до 650 изображений.
- Набор данных был очищен вручную и проверен на наличие не связанных или плохого качества изображений ( фотографии имеют разные размеры ).
Вот моя модель CNN:
classifier = Sequential()
def cnn_layer_creation(classifier):
classifier.add(InputLayer(input_shape=[224,224,3]))
classifier.add(Conv2D(filters=32,kernel_size=5,strides=1,padding='same',activation='relu',data_format='channels_first'))
classifier.add(MaxPooling2D(pool_size=5,padding='same'))
classifier.add(Conv2D(filters=50,kernel_size=5,strides=1,padding='same',activation='relu'))
classifier.add(MaxPooling2D(pool_size=5,padding='same'))
classifier.add(Conv2D(filters=80,kernel_size=5,strides=1,padding='same',activation='relu',data_format='channels_last'))
classifier.add(MaxPooling2D(pool_size=5,padding='same'))
classifier.add(Dropout(0.25))
classifier.add(Flatten())
classifier.add(Dense(64,activation='relu'))
classifier.add(Dropout(rate=0.5))
classifier.add(Dense(91,activation='softmax'))
# Compiling the CNN
classifier.compile(optimizer="RMSprop", loss = 'categorical_crossentropy', metrics = ['accuracy'])
data_initialization(classifier)
def data_initialization(classifier):
# Part 2 - Fitting the CNN to the images
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,
shear_range = 0.2,
zoom_range = 0.2,
horizontal_flip = True)
training_set = train_datagen.flow_from_directory('food_image/train',
target_size = (224, 224),
batch_size = 100,
class_mode = 'categorical')
test_set = test_datagen.flow_from_directory('food_image/test',
target_size = (224, 224),
batch_size = 100,
class_mode = 'categorical')
classifier.fit_generator(training_set,
steps_per_epoch = 100,
epochs = 100,
validation_data = test_set,
validation_steps = 100)
classifier.save("brynModelGPULite.h5")
classifier.summary()
def main():
cnn_layer_creation(classifier)
Обучение проводится на GPU (nVidia 980M)
К сожалению, точность не превысила 10%. Вот что я попробовал:
Увеличение количества эпох.
Смена оптимизатора (ADAM, RMSPROP).
Изменить функцию активации.
Уменьшить размер входного изображения.
Увеличение размера партии.
Измените размер фильтра на 32, 64, 128.
Ни один из них не улучшил точность.
Может ли кто-нибудь пролить свет на то, как можно улучшить точность модели?