почему моя модель плохо работает для последовательной модели keras?

#python #machine-learning #keras #deep-learning #neural-network

#python #машинное обучение #keras #глубокое обучение #нейронная сеть

Вопрос:

Я новичок в глубоком обучении (и машинном обучении), и я создал скрипт на python, который использует TensorFlow / Keras для определения цветов в разных группах, используя этот набор данных. Вот мой код: (я делаю это на Kaggle)

 import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.model_selection import GridSearchCV
from sklearn.preprocessing import LabelEncoder
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.optimizers import Adam, SGD
from keras.utils import to_categorical
from keras.layers import Conv2D, Dropout, Dense, Flatten
import matplotlib.pyplot as plt
import cv2
import os

NUM_CLASSES = 5
IMG_SIZE = 150
DAISY = '../input/flowers-recognition/flowers/daisy'
DANDELION = '../input/flowers-recognition/flowers/dandelion'
ROSE = '../input/flowers-recognition/flowers/rose'
SUNFLOWER = '../input/flowers-recognition/flowers/sunflower'
TULIP = '../input/flowers-recognition/flowers/tulip'

x = []
y = []

def train_data_gen(DIR, ID):
    for img in os.listdir(DIR):
        try:
            path = DIR   '/'   img
            img = plt.imread(path)
            img = cv2.resize(img,(IMG_SIZE,IMG_SIZE))
            x.append(img)
            y.append(ID)
        except:
            None

train_data_gen(DAISY, 0)
train_data_gen(DANDELION, 1)
train_data_gen(ROSE, 2)
train_data_gen(SUNFLOWER, 3)
train_data_gen(TULIP, 4)

x = np.array(x)
y = to_categorical(y,num_classes = 5)

x_train,x_test,y_train,y_test = train_test_split(x, y, test_size = 0.15)
x_train,x_val,y_train,y_val = train_test_split(x_train, y_train, test_size = 0.15)

datagen = ImageDataGenerator(
    featurewise_center=False,
    samplewise_center=False,
    samplewise_std_normalization=False,
    rotation_range=60,
    zoom_range = 0.1,
    width_shift_range=0.1,
    height_shift_range=0.1,
    shear_range=0.1,
    fill_mode = "reflect"
)

datagen.fit(x_train)

model = Sequential()
model.add(Conv2D(64, kernel_size=(3, 3), strides=2, activation='relu', input_shape=(IMG_SIZE, IMG_SIZE, 3)))
model.add(Dropout(0.5))
model.add(Conv2D(128, kernel_size=(3, 3), strides=2, activation='relu'))
model.add(Dropout(0.5))
model.add(Conv2D(128, kernel_size=(3, 3), strides=2, activation='relu'))
model.add(Dropout(0.5))
model.add(Conv2D(128, kernel_size=(3, 3), strides=2, activation='relu'))
model.add(Dropout(0.5))
model.add(Flatten())
model.add(Dense(1024, activation='relu'))
model.add(Dense(5, activation='softmax'))

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit_generator(datagen.flow(x_train,y_train,batch_size=16), epochs=10, steps_per_epoch=x_train.shape[0]//16, validation_data=(x_val, y_val), verbose=1)
  

Я знаю, что здесь значение epochs равно 10, но позже я установил его равным 100. Это заняло очень много времени, поэтому я остановил его на 63-й эпохе. Даже тогда точность составляла около 60%, что слишком мало. Что я могу изменить, чтобы сделать ее более точной? Может быть, мой CNN слишком мал для этого? Или что-то не так с моими данными? Я действительно новичок в этом, поэтому я не могу конкретизировать свой вопрос дальше, чем «Почему моя модель плохо работает?»
Заранее спасибо всем за конструктивную обратную связь.

Ответ №1:

Ваша модель использует слишком много выпадающих слоев. model.add(Dropout(0.5)) эффективно удаляет 50% ваших нейронов вашего входящего слоя, и, кроме того, у вас их 4. Скорее всего, вы недостаточно приспособлены.

После каждого Conv2D слоя добавьте keras.layers.MaxPooling2D слой.

Сначала попробуйте удалить все выпадающие слои. В этом случае вы рискуете переобучиться — но если вы не переобучаетесь, тогда нет смысла отсеивать слои. Если вы выполняете overfit, поэкспериментируйте только с 1 уровнем отсева с частотой отсева 20% и постепенно увеличивайте ее до 50%, а затем, возможно, добавьте еще 20% отсева и продолжайте.