Подгонка модели CNN и неправильное обучение из последовательностей OpenCV при обучении играм - PullRequest
0 голосов
/ 06 апреля 2019

Я пытаюсь запустить Convolution Neural Network, чтобы иметь возможность играть в старые NES Ice Climbers.Прямо сейчас я использовал OpenCV, чтобы захватить экран для входных данных, а выход - это действие ледолазания, такое как ходьба влево - вправо или прыжок.Проблема, с которой я сталкиваюсь, состоит в том, что обученная модель на самом деле не учится должным образом или она переоснащается, когда я проверяю ее.

Я попытался уменьшить выходы, исключив команду перехода.Я пробовал разные размеры партий, эпохи и разные тестовые данные.Я также пытался изменить оптимизатор и размеры, но ничто не оказало существенного влияния.

Вот код, когда я снимаю экран и использую эти данные для обучения моей модели.Мои тренировочные данные - это 900 последовательных снимков экрана с нажатыми соответствующими входами, которые я сыграл.У меня есть около 10 тыс. Последовательностей, сохраненных от игры для тренировочных данных.

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 голосов
/ 06 апреля 2019

Общая настройка звучит больше как хорошая среда для обучения подкреплению.

Если вы хотите придерживаться контролируемой настройки обучения, вам следует сначала проверить, есть ли в разных классах одинаковое количество примеров обучения. Если это так, вы можете поэкспериментировать со скоростью обучения, большей регуляризацией (отсевом), сетевой архитектурой и т. Д.

...