Потеря обучения CNN застряла в значениях между 51-60 - PullRequest
0 голосов
/ 19 октября 2019

Я пытаюсь создать свой первый CNN для прогнозирования цен на квартиры. Проблема в том, что после 1-5 эпох значение потери застревает и не уменьшается, только немного увеличивается, а затем снова уменьшается. Заранее спасибо)

from keras.layers import Conv2D, MaxPool2D, Dense, BatchNormalization, Flatten
from keras.optimizers import Adam
from keras.models import Sequential

from keras.preprocessing.image import ImageDataGenerator
from PIL import Image
import pandas as pd

train_data_df = pd.read_excel('train_data_cnn.xlsx')
test_data_df = pd.read_excel('test_data_cnn.xlsx')

datagen = ImageDataGenerator(rescale=1./255)
train_data = datagen.flow_from_dataframe(dataframe=train_data_df, x_col='filepath', y_col='price', class_mode='raw', directory=r'C:\Users\Kojimba\PycharmProjects\DeepEval\CNN', batch_size=20)
test_data = datagen.flow_from_dataframe(dataframe=train_data_df, x_col='filepath', y_col='price', class_mode='raw', directory=r'C:\Users\Kojimba\PycharmProjects\DeepEval\CNN', batch_size=20)

model = Sequential([
    Conv2D(32, kernel_size=32, strides=(2,2), padding='same', activation='relu', input_shape=(256, 256, 3), data_format='channels_last'),
    #BatchNormalization(),
    MaxPool2D(strides=2),
    Conv2D(128, kernel_size=64, strides=(4,4), padding='same', activation='relu'),
    #BatchNormalization(),
    MaxPool2D(),
    Flatten(),
    Dense(8, activation='relu', kernel_initializer='random_normal', bias_initializer='zeros'),
    Dense(8, activation='relu', kernel_initializer='random_normal', bias_initializer='zeros'),
    Dense(1, activation='linear', kernel_initializer='random_normal', bias_initializer='zeros')
])

model.compile(Adam(lr=0.01, beta_1=0.98, beta_2=0.999), loss='mean_absolute_percentage_error')
model.summary()

model.fit_generator(train_data, steps_per_epoch=24, epochs=100)

model.evaluate_generator(test_data)

1 Ответ

1 голос
/ 19 октября 2019

Ваш последний плотный слой имеет один выход. Это предназначено? Если у вас более двух классов, вы хотите, чтобы в вашем последнем плотном слое было указано количество классов.

Кроме того, вы пытались уменьшить свой lr? Это выглядит высоко. Вы также можете попытаться добавить выпадающий слой после Conv2D. Что-то вроде "Dropout (0.2)"

...