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。
感谢您的帮助。
答案 0 :(得分:0)
我已经结束了这个问题,并打开了一个更详细的问题