LSTM类不平衡

时间:2019-07-09 01:08:23

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

TLDR

使用CNN提取特征,并将其输入到单独的多对多LSTM模型中。二进制分类,但1级与2级的比率为1:4,导致训练期间过拟合。

据我了解,如果我删除第2类数据以使比率现在为1:1,请用标签将数据混洗,以使模型不会猜测上半样本的第1类数据,这将破坏数据的时间顺序。该模型将无法基于相邻帧做出良好的预测。

我该如何解决?

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

这个想法是创建一个Flappy Bird机器人,该机器人可以接收5张图像,并预测是否跳转。为了实现这一目标,我以大约10 fps的速度拍摄了20000张游戏图像,并从以下架构的Flatten()层中提取了功能。

输入:(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)

然后我将要素重塑为(4 000, 5, 2),其中5是我的time_step。我还将标签重塑为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)] ,其中跳转和不跳转均是一键编码。然后,我将这些功能作为许多LSTM的输入。

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

如预期的那样,模型过拟合,我停止了训练:

fields

如上所述,我确实考虑过平衡类和改组数据(我都没有做过),因为我的理解会弄乱图像的顺序,这将使LSTM的使用失去意义。

我尝试仅使用经过训练的CNN,该CNN在带有混洗和平衡类的单个帧上进行训练,并且获得了0.9 val_acc和0.95 acc,这相当不错。但是,在测试该漫游器时,它无法持续超过6秒;其最高分只有3。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我已经结束了这个问题,并打开了一个更详细的问题