Почему мой предварительно обученный классификатор изображений CNN перегружен? - PullRequest
0 голосов
/ 24 сентября 2019

Я только что начал с Computer Vision, и в текущей задаче я классифицирую изображения по 4 категориям.

Общее количество файлов изображений = 1043

Я использую предварительно обученный InceptionV3 и тонкую настройкуэто в моем наборе данных.

Это то, что у меня есть после эпохи: Эпоха 1/5 320/320 [====================================] - 1925 с 6 с / шаг - потеря: 0,4318 - согласно: 0,8526 - val_loss: 1,1202 - val_acc: 0,5557

Epoch 2/5 320/320 [==============================] - 1650 с 5 с / шаг - потеря: 0,1807 - акк: 0,9446 - val_loss: 1,2694 - val_acc: 0,5436

Epoch 3/5 320/320 [====================================] - 1603 с 5 с / шаг - потеря: 0,1236- в соотв. 0,9572 - val_loss: 1,2597 - val_acc: 0,5546

Epoch 4/5 320/320 [=====================================] - 1582 с 5 с / шаг - потеря: 0,1057 - согласно: 0,9671 - val_loss: 1,3845 - val_acc: 0,5457

Epoch 5/5 320/320 [==============================] - 1580 с 5 с / шаг - потеря: 0,0982 - акк: 0,9700 - val_loss: 1,2771 - val_acc: 0,5572 Tшляпа это огромная разница.Пожалуйста, помогите мне выяснить, почему моя модель не может обобщать, поскольку она достаточно хорошо вписывается в данные поезда.

мой код для справки: -

from keras.utils import to_categorical
from keras.models import Model
from keras.layers import Dense, GlobalAveragePooling2D, Dropout
from keras.applications.inception_v3 import InceptionV3, preprocess_input

CLASSES = 4

# setup model
base_model = InceptionV3(weights='imagenet', include_top=False)
from sklearn.preprocessing import OneHotEncoder
x = base_model.output
x = GlobalAveragePooling2D(name='avg_pool')(x)
x = Dropout(0.4)(x)
predictions = Dense(CLASSES, activation='softmax')(x)
model = Model(inputs=base_model.input, outputs=predictions)

for layer in base_model.layers:
    layer.trainable = False

model.compile(optimizer='rmsprop',
              loss='categorical_crossentropy',
              metrics=['accuracy'])        

from sklearn.preprocessing import LabelEncoder
encoder = LabelEncoder()
df['Category']= encoder.fit_transform(df['Category'])



from keras.preprocessing.image import ImageDataGenerator

WIDTH = 299
HEIGHT = 299
BATCH_SIZE = 32


train_datagen = ImageDataGenerator(rescale=1./255,preprocessing_function=preprocess_input)



validation_datagen = ImageDataGenerator(rescale=1./255)


df['Category'] =df['Category'].astype(str)
#dfval['Category'] = dfval['Category'].astype(str)




from sklearn.utils import shuffle
df = shuffle(df)

from sklearn.model_selection import train_test_split

dftrain,dftest = train_test_split(df, test_size = 0.2, random_state = 0)

train_generator = train_datagen.flow_from_dataframe(dftrain,target_size=(HEIGHT, WIDTH),batch_size=BATCH_SIZE,class_mode='categorical', x_col='Path', y_col='Category')

validation_generator = validation_datagen.flow_from_dataframe(dftest,target_size=(HEIGHT, WIDTH),batch_size=BATCH_SIZE,class_mode='categorical', x_col='Path', y_col='Category')



EPOCHS = 5
BATCH_SIZE = 32
STEPS_PER_EPOCH = 320
VALIDATION_STEPS = 64

MODEL_FILE = 'filename.model'

history = model.fit_generator(
    train_generator,
    epochs=EPOCHS,
    steps_per_epoch=STEPS_PER_EPOCH,
    validation_data=validation_generator,
    validation_steps=VALIDATION_STEPS)

Любая помощь будетоценил:)

1 Ответ

0 голосов
/ 24 сентября 2019

Если вы не используете preprocess_input во «всех» ваших данных, вы получите ужасные результаты.

Посмотрите на это:

train_datagen = ImageDataGenerator(
    preprocessing_function=preprocess_input, 
    ...)

validation_datagen = ImageDataGenerator()

Теперь я заметил, что вы используете rescale.Поскольку вы импортировали правильную функцию preprocess_input из начального кода, я действительно считаю, что вам не следует использовать эту масштабирование.Предполагается, что функция preprocess_input выполняет всю необходимую предварительную обработку.(Не все модели были обучены с нормированными входами)

Но будет ли проблема масштабирования, если вы примените ее к обоим батасетам?

Хорошо ... еслиtrainable=False, примененный правильно к слоям BatchNormalization, это означает, что в этих слоях хранятся значения среднего и вариации, которые будут хорошо работать, только если данные находятся в ожидаемом диапазоне.

...