【问题标题】:CNN training loss stuck at values between 51-60CNN 训练损失停留在 51-60 之间
【发布时间】:2019-10-19 15:09:55
【问题描述】:

我正在尝试创建我的第一个 CNN 来预测公寓价格。问题是在 1-5 个 epoch 之后损失值被卡住并且没有减少,只是增加了一点然后又减少了。提前致谢)

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)

【问题讨论】:

    标签: python pandas keras deep-learning conv-neural-network


    【解决方案1】:

    你的最后一个密集层有一个输出。这是故意的吗? 如果您有两个以上的类,您希望最后一个密集层将类数作为输出。

    除此之外,您还尝试过降低 lr 吗? 它看起来很高。 你也可以尝试在你的 Conv2D 之后添加一个 dropout 层。 类似“Dropout(0.2)”

    【讨论】:

    • 是的,最后一层是因为它是一个回归模型,有点。如果我使用较低的 lr,即使是 0.001,也需要永远通过第一个 epoch,更不用说下一个,以此类推。尝试 dropout - 它有助于平衡损失,但仍然没有低于 51
    • 永远有多长?你是在 cpu 还是 gpu 上运行它?
    • 一个纪元大约需要 2 分钟。我在 cpu 上运行训练
    • 如果您发布数据,我可以运行您的模型并查看我得到的结果。两分钟不是很多时间。你应该减少纪元的数量。当使用过高的学习率时,您可能会陷入局部最小值/最大值的风险。因此最好使用低学习率
    猜你喜欢
    • 2018-05-29
    • 2020-09-04
    • 1970-01-01
    • 2018-08-03
    • 1970-01-01
    • 2019-04-20
    • 2016-02-23
    • 2019-12-26
    • 2020-06-13
    相关资源
    最近更新 更多