CNN模型过度拟合,并且在学习游戏时无法从OpenCV序列中正确学习

时间:2019-04-06 16:47:53

标签: python opencv keras conv-neural-network cntk

我正在尝试建立一个卷积神经网络,以便能够播放旧的NES攀冰者。现在,我已经利用OpenCV捕获输入屏幕,而输出则是攀冰者的动作,例如向左或向右行走或跳跃。我遇到的问题是,经过训练的模型实际上无法正确学习,或者从我验证模型时就过拟合了。

我尝试通过排除跳转命令来降低输出。我尝试了不同的批次大小,时期和不同的测试数据。我还尝试过更改优化程序和尺寸,但是没有任何影响。

这是我捕获屏幕并使用该数据训练模型时的代码。我的训练数据是900个连续的屏幕截图,分别播放了我播放的输入内容。我从播放训练数据中节省了大约1万个序列。

def screen_record():
   global last_time
   printscreen =  np.array(ImageGrab.grab(bbox=(0,130,800,640)))
   last_time = time.time()
   processed = greycode(printscreen)
   processed = cv2.resize(processed, (80, 60))
   cv2.imshow('AIBOX', processed)
   cv2.moveWindow("AIBOX", 500, 150);

   #training.append([processed, check_input()])
   processed = np.array(processed).reshape(-1, 80, 60, 1)
   result = AI.predict(processed, batch_size=1)
   print (result)
   AI_Control_Access(result)

def greycode(screen):
   greymap = cv2.cvtColor(screen, cv2.COLOR_BGR2GRAY) 
   greymap = cv2.Canny(greymap, threshold1=200, threshold2=300) 
   return  greymap    

def network_train():
   train_data = np.load('ICE_Train5.npy')
   train = train_data[::7]
   test = train_data[-3::]

   x_train = np.array([i[0] for i in train]).reshape(-1,80,60,1)
   x_test = np.array([i[0] for i in test]).reshape(-1,80,60,1)
   y_train = np.asarray([i[1] for i in train])
   y_test = np.asarray([i[1] for i in test])

   model = Sequential()
   model.add(Convolution2D(32, (3, 3), activation='relu', input_shape=(80, 60, 1)))
   model.add(Convolution2D(16, (5, 5), activation='relu', strides=4))
   model.add(MaxPooling2D(pool_size=(2, 2)))
   model.add(Dropout(0.25))
   model.add(Flatten())
   model.add(Dense(128, activation='relu'))
   model.add(Dropout(0.5))
   model.add(Dense(2, activation='softmax'))
   sgd = SGD(lr=0.1, decay=1e-6, momentum=0.9, nesterov=True)
   model.compile(loss='categorical_crossentropy', optimizer='sgd')
   model.fit(x_train, y_train,batch_size=450,epochs=50,verbose=1,callbacks=None,validation_split=0,validation_data=None,shuffle=False,
           class_weight=None,sample_weight=None,initial_epoch=0,steps_per_epoch=None,validation_steps=None)

当我针对测试数据运行它进行验证时,我可以得到的最高分数约为16%,但是即使我使用该模型实际玩游戏,它也总是会预测按下相同的按钮,所以我认为这是由于过度模型的拟合或根本没有学习的模型,但是由于这是我第一次使用卷积网络,所以我不确定如何调整网络以使其对训练更加敏感。

1 个答案:

答案 0 :(得分:0)

一般设置听起来更像是加强学习的良好环境。

如果您要坚持监督学习的设置,则应首先检查您的不同班级是否有相同数量的培训示例。如果是这样,您可以尝试学习率,更多的正则化(辍学),网络架构等。