【问题标题】:LSTM Class ImbalanceLSTM 类不平衡
【发布时间】:2019-07-09 01:08:23
【问题描述】:

TLDR

使用 CNN 提取特征,输入单独的多对多 LSTM 模型。二元分类,但类 1 与类 2 的比例为 1:4,导致训练期间过拟合。

据我了解,如果我删除 2 类数据使得比率现在为 1:1,用标签对数据进行混洗,这样模型就不会猜测前半部分样本的 1 类,我将毁掉数据的时间序列。该模型将无法根据相邻帧做出良好的预测。

我该如何解决这个问题?

------------------------------------------ -------------------------------------------------- --------------------------------------

这个想法是创建一个 Flappy Bird 机器人,它接收 5 张图像序列并预测是否跳跃。为了实现这一点,我以大约 10 fps 的 20000 张游戏图像作为输入,并从以下架构的 Flatten() 层中提取了特征。

输入:(samples, height, width, channels)(20 000, 250, 150, 3)

功能:(20 000, 14336)

model = Sequential()

model.add(Conv2D(64, 3, 3, border_mode='same', input_shape=(250,150,3), activation='relu'))
model.add(Conv2D(64, 3, 3, border_mode='same', activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(128, 3, 3, border_mode='same', activation='relu'))
model.add(Conv2D(128, 3, 3, border_mode='same', activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(256, 3, 3, border_mode='same', activation='relu'))
model.add(Conv2D(256, 3, 3, border_mode='same', activation='relu'))
model.add(Conv2D(256, 3, 3, border_mode='same', activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(512, 3, 3, border_mode='same', activation='relu'))
model.add(Conv2D(512, 3, 3, border_mode='same', activation='relu'))
model.add(Conv2D(512, 3, 3, border_mode='same', activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(512, 3, 3, border_mode='same', activation='relu'))
model.add(Conv2D(512, 3, 3, border_mode='same', activation='relu'))
model.add(Conv2D(512, 3, 3, border_mode='same', activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Flatten())
model.summary()

RMSprop = optimizers.RMSprop(lr=0.0001)
model.compile(loss='binary_crossentropy', optimizer=RMSprop, metrics=['accuracy'])

callbacks = [EarlyStopping(monitor='val_acc', min_delta=0.0001, mode='max', patience=10)]

然后我将特征重新调整为(4 000, 5, 14336),其中 5 是我的时间步长。我还将我的标签重塑为(4 000, 5, 2),其中 jump 和 not jump 是一次性编码的。然后我将这些特征作为多对多 LSTM 的输入。

model = Sequential()

model.add(LSTM(256, return_sequences=True, input_shape=(5, 14336), dropout=0.5))
model.add(Dense(256, activation='relu'))
model.add(Dropout(0.5))

model.add(Dense(2, activation='softmax'))
model.summary()

RMSprop = optimizers.RMSprop(lr=0.0001)
model.compile(loss='binary_crossentropy', optimizer=RMSprop, metrics=['accuracy'])

callbacks = [EarlyStopping(monitor='val_acc', min_delta=0.0001, mode='max', patience=10)]

不出所料,模型过拟合,我停止了训练:

Epoch 6/50
3232/3232 [==============================] - 138s 43ms/step - loss: 0.5020 - acc: 0.8058 - val_loss: 0.5541 - val_acc: 0.7735

如前所述,我确实考虑过平衡类和改组数据(这两项我都没有做过),因为我的理解是这会弄乱图像序列,这会影响使用 LSTM 的全部意义。

我曾尝试仅使用在单个帧上训练的 CNN,该 CNN 具有随机播放和平衡类,并且达到了 0.9 val_acc 和 0.95 acc,这相当不错。但是,在测试该机器人时,它的持续时间未能超过 6 秒;它的高分只有 3 分。

感谢任何帮助。

【问题讨论】:

  • 您是否尝试过自定义损失函数,根据样本的总体对样本进行加权?
  • @SaTa 不,我有。关于创建一个的任何提示?感谢您的建议;将谷歌如何制作一个
  • 您也可以从调整 model.fit 的 class_weight 和 sample_weight 输入开始。这将比编写自定义损失更容易。

标签: many-to-many conv-neural-network lstm


【解决方案1】:

我已经关闭了这个问题并打开了一个更详细的问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-10
    • 1970-01-01
    • 2016-02-08
    • 2014-12-11
    • 1970-01-01
    • 2020-10-11
    • 2018-03-24
    • 2019-02-14
    相关资源
    最近更新 更多