diff --git a/10 - DQN/pyplot/README.md b/10 - DQN/pyplot/README.md deleted file mode 100644 index 485069a3..00000000 --- a/10 - DQN/pyplot/README.md +++ /dev/null @@ -1,103 +0,0 @@ -# Deep Q-network - -- 구글의 딥마인드에서 개발한 Deep Q-network (DQN)을 이용하여 Q-learning 을 구현해봅니다. -- 빠른 학습을 위해 게임은 간단한 장애물 피하기 게임을 직접 구현했습니다 - - 화면 출력은 matplotlib 으로 구현하였습니다. - - OpenAI의 Gym과 거의 동일한 인터페이스로 만들었습니다. - -### 파일 설명 - -- agent.py - - 게임을 진행하거나 학습시키는 에이전트입니다. -- game.py - - 게임을 구현해 놓은 파일입니다. 게임의 상태를 화면의 픽셀로 가져오지 않고, 좌표값을 이용하여 계산량을 줄이도록 하였습니다. -- model.py - - DQN을 구현해 놓은 파일입니다. - - 논문에서는 CNN 모델을 사용하였지만, 구현을 간단히 하고 성능을 빠르게 하기 위해 기본적인 신경망 모델을 사용합니다. - -### 핵심 코드 - -게임 구현을 위한 다양한 내용들이 들어있어 코드분량이 꽤 많지만, 핵심 내용은 딱 다음과 같습니다. - -1. Q_value 를 이용해 얻어온 액션을 수행하고, 해당 액션에 의한 게임의 상태와 리워드를 획득한 뒤, 이것을 메모리에 순차적으로 쌓아둡니다. (model.py/step 함수 참고) -2. 일정 수준 이상의 메모리가 쌓이면, 메모리에 저장된 것들 중 샘플링을 하여 논문의 수식을 이용해 다음처럼 최적화를 수행합니다. -3. Q_value로 예측한 액션으로 상태를 만들어내고, target_Q_value와 비교하는 형식을 취합니다. - - 학습시 예측을 위한 Q_value와 손실값을 위해 실측값을 계산할 Q_value는 네트웍을 따로 구성하여 계산합니다. - - target_Q_value를 구하는 타겟 네트웍은 메인 네트웍과 항상 같이 학습시키는 것이 아니라, 메인 네트웍을 일정 횟수 이상 학습시킨 뒤, 정해진 횟수가 지나면 메인 네트웍의 신경망 변수 값들을 타겟 네트웍에 복사하는 방법을 사용합니다. - - 학습시 타겟을 메인 네트웍에서 구하면, 비교할 대상이 예측한 것과 계속 비슷한 상태로 비교하기 때문에 학습이 안정적으로 이루어지지 않기 때문입니다. - -```python -def _build_op(self): - # DQN 의 손실 함수를 구성하는 부분입니다. 다음 수식을 참고하세요. - # Perform a gradient descent step on (y_j-Q(ð_j,a_j;θ))^2 - one_hot = tf.one_hot(self.input_A, self.n_action, 1.0, 0.0) - Q_value = tf.reduce_sum(tf.multiply(self.Q_value, one_hot), axis=1) - cost = tf.reduce_mean(tf.square(self.input_Y - Q_value)) - train_op = tf.train.AdamOptimizer(1e-6).minimize(cost) - - return cost, train_op - -def get_action(self): - Q_value = self.session.run(self.Q_value, - feed_dict={self.input_X: [self.state]}) - - action = np.argmax(Q_value[0]) - - return action - -def train(self): - # 게임 플레이를 저장한 메모리에서 배치 사이즈만큼을 샘플링하여 가져옵니다. - state, next_state, action, reward, terminal = self._sample_memory() - - # 학습시 다음 상태를 만들어 낸 Q value를 입력값으로 - # 타겟 네트웍의 Q value를 실측값으로하여 학습합니다 - Q_value = self.session.run(self.target_Q_value, - feed_dict={self.input_X: next_state}) - - # DQN 의 손실 함수에 사용할 핵심적인 값을 계산하는 부분입니다. 다음 수식을 참고하세요. - # if episode is terminates at step j+1 then r_j - # otherwise r_j + γ*max_a'Q(ð_(j+1),a';θ') - # input_Y 에 들어갈 값들을 계산해서 넣습니다. - Y = [] - for i in range(self.BATCH_SIZE): - if terminal[i]: - Y.append(reward[i]) - else: - Y.append(reward[i] + self.GAMMA * np.max(Q_value[i])) - - self.session.run(self.train_op, - feed_dict={ - self.input_X: state, - self.input_A: action, - self.input_Y: Y - }) -``` - -### 결과물 - -- 상상력을 발휘해주세요. 검정색 배경은 도로, 사각형을 자동차들로 그리고 녹색 사각형을 자율 주행차라고 상상하고 즐겨주시면 감사하겠습니다. :-D -- 180만번 정도의 학습 후 최고의 성능을 내기 시작했으며, 2012 맥북프로 CPU 버전으로 최고 성능을 내는데까지 약 3시간 정도 걸렸습니다. - -![게임](screenshot_game.gif) - -![텐서보드](screenshot_tensorboard.png) - -### 사용법 - -자가 학습시키기 - -``` -python agent.py --train -``` - -얼마나 잘 하는지 확인해보기 - -``` -python agent.py -``` - -텐서보드로 평균 보상값 확인해보기 - -``` -tensorboard --logdir=./logs -``` diff --git a/10 - DQN/pyplot/agent.py b/10 - DQN/pyplot/agent.py deleted file mode 100644 index 5a171c4c..00000000 --- a/10 - DQN/pyplot/agent.py +++ /dev/null @@ -1,153 +0,0 @@ -# 게임 구현과 DQN 모델을 이용해 게임을 실행하고 학습을 진행합니다. -import tensorflow as tf -import numpy as np -import random -import time - -from game import Game -from model import DQN - - -tf.app.flags.DEFINE_boolean("train", False, "학습모드. 게임을 화면에 보여주지 않습니다.") -FLAGS = tf.app.flags.FLAGS - -# 최대 학습 횟수 -MAX_EPISODE = 10000 -# 1000번의 학습마다 한 번씩 타겟 네트웍을 업데이트합니다. -TARGET_UPDATE_INTERVAL = 1000 -# 4 프레임마다 한 번씩 학습합니다. -TRAIN_INTERVAL = 4 -# 학습 데이터를 어느정도 쌓은 후, 일정 시간 이후에 학습을 시작하도록 합니다. -OBSERVE = 100 - -# action: 0: 좌, 1: 유지, 2: 우 -NUN_ACTION = 3 -SCREEN_WIDTH = 6 -SCREEN_HEIGHT = 10 - - -def train(): - print('뇌세포 깨우는 중..') - sess = tf.Session() - - game = Game(SCREEN_WIDTH, SCREEN_HEIGHT, show_game=False) - brain = DQN(sess, SCREEN_WIDTH, SCREEN_HEIGHT, NUN_ACTION) - - rewards = tf.placeholder(tf.float32, [None]) - tf.summary.scalar('avg.reward/ep.', tf.reduce_mean(rewards)) - - saver = tf.train.Saver() - sess.run(tf.global_variables_initializer()) - - writer = tf.summary.FileWriter('logs', sess.graph) - summary_merged = tf.summary.merge_all() - - # 타겟 네트웍을 초기화합니다. - brain.update_target_network() - - # 다음에 취할 액션을 DQN 을 이용해 결정할 시기를 결정합니다. - epsilon = 1.0 - # 프레임 횟수 - time_step = 0 - total_reward_list = [] - - # 게임을 시작합니다. - for episode in range(MAX_EPISODE): - terminal = False - total_reward = 0 - - # 게임을 초기화하고 현재 상태를 가져옵니다. - # 상태는 screen_width x screen_height 크기의 화면 구성입니다. - state = game.reset() - brain.init_state(state) - - while not terminal: - # 입실론이 랜덤값보다 작은 경우에는 랜덤한 액션을 선택하고 - # 그 이상일 경우에는 DQN을 이용해 액션을 선택합니다. - # 초반엔 학습이 적게 되어 있기 때문입니다. - # 초반에는 거의 대부분 랜덤값을 사용하다가 점점 줄어들어 - # 나중에는 거의 사용하지 않게됩니다. - if np.random.rand() < epsilon: - action = random.randrange(NUN_ACTION) - else: - action = brain.get_action() - - # 일정 시간이 지난 뒤 부터 입실론 값을 줄입니다. - # 초반에는 학습이 전혀 안되어 있기 때문입니다. - if episode> OBSERVE: - epsilon -= 1 / 1000 - - # 결정한 액션을 이용해 게임을 진행하고, 보상과 게임의 종료 여부를 받아옵니다. - state, reward, terminal = game.step(action) - total_reward += reward - - # 현재 상태를 Brain에 기억시킵니다. - # 기억한 상태를 이용해 학습하고, 다음 상태에서 취할 행동을 결정합니다. - brain.remember(state, action, reward, terminal) - - if time_step> OBSERVE and time_step % TRAIN_INTERVAL == 0: - # DQN 으로 학습을 진행합니다. - brain.train() - - if time_step % TARGET_UPDATE_INTERVAL == 0: - # 타겟 네트웍을 업데이트 해 줍니다. - brain.update_target_network() - - time_step += 1 - - print('게임횟수: %d 점수: %d' % (episode + 1, total_reward)) - - total_reward_list.append(total_reward) - - if episode % 10 == 0: - summary = sess.run(summary_merged, feed_dict={rewards: total_reward_list}) - writer.add_summary(summary, time_step) - total_reward_list = [] - - if episode % 100 == 0: - saver.save(sess, 'model/dqn.ckpt', global_step=time_step) - - -def replay(): - print('뇌세포 깨우는 중..') - sess = tf.Session() - - game = Game(SCREEN_WIDTH, SCREEN_HEIGHT, show_game=True) - brain = DQN(sess, SCREEN_WIDTH, SCREEN_HEIGHT, NUN_ACTION) - - saver = tf.train.Saver() - ckpt = tf.train.get_checkpoint_state('model') - saver.restore(sess, ckpt.model_checkpoint_path) - - # 게임을 시작합니다. - for episode in range(MAX_EPISODE): - terminal = False - total_reward = 0 - - state = game.reset() - brain.init_state(state) - - while not terminal: - action = brain.get_action() - - # 결정한 액션을 이용해 게임을 진행하고, 보상과 게임의 종료 여부를 받아옵니다. - state, reward, terminal = game.step(action) - total_reward += reward - - brain.remember(state, action, reward, terminal) - - # 게임 진행을 인간이 인지할 수 있는 속도로^^; 보여줍니다. - time.sleep(0.3) - - print('게임횟수: %d 점수: %d' % (episode + 1, total_reward)) - - -def main(_): - if FLAGS.train: - train() - else: - replay() - - -if __name__ == '__main__': - tf.app.run() diff --git a/10 - DQN/pyplot/game.py b/10 - DQN/pyplot/game.py deleted file mode 100644 index 48a9e889..00000000 --- a/10 - DQN/pyplot/game.py +++ /dev/null @@ -1,191 +0,0 @@ -# 장애물 회피 게임 즉, 자율주행차:-D 게임을 구현합니다. -import numpy as np -import random - -import matplotlib.pyplot as plt -import matplotlib.patches as patches - - -class Game: - def __init__(self, screen_width, screen_height, show_game=True): - self.screen_width = screen_width - self.screen_height = screen_height - # 도로의 크기는 스크린의 반으로 정하며, 도로의 좌측 우측의 여백을 계산해둡니다. - self.road_width = int(screen_width / 2) - self.road_left = int(self.road_width / 2 + 1) - self.road_right = int(self.road_left + self.road_width - 1) - - # 자동차와 장애물의 초기 위치와, 장애물 각각의 속도를 정합니다. - self.car = {"col": 0, "row": 2} - self.block = [ - {"col": 0, "row": 0, "speed": 1}, - {"col": 0, "row": 0, "speed": 2}, - ] - - self.total_reward = 0. - self.current_reward = 0. - self.total_game = 0 - self.show_game = show_game - - if show_game: - self.fig, self.axis = self._prepare_display() - - def _prepare_display(self): - """게임을 화면에 보여주기 위해 matplotlib 으로 출력할 화면을 설정합니다.""" - fig, axis = plt.subplots(figsize=(4, 6)) - fig.set_size_inches(4, 6) - # 화면을 닫으면 프로그램을 종료합니다. - fig.canvas.mpl_connect('close_event', exit) - plt.axis((0, self.screen_width, 0, self.screen_height)) - plt.tick_params(top='off', right='off', - left='off', labelleft='off', - bottom='off', labelbottom='off') - - plt.draw() - # 게임을 진행하며 화면을 업데이트 할 수 있도록 interactive 모드로 설정합니다. - plt.ion() - plt.show() - - return fig, axis - - def _get_state(self): - """게임의 상태를 가져옵니다. - - 게임의 상태는 screen_width x screen_height 크기로 각 위치에 대한 상태값을 가지고 있으며, - 빈 공간인 경우에는 0, 사물이 있는 경우에는 1이 들어있는 1차원 배열입니다. - 계산의 편의성을 위해 2차원 -> 1차원으로 변환하여 사용합니다. - """ - state = np.zeros((self.screen_width, self.screen_height)) - - state[self.car["col"], self.car["row"]] = 1 - - if self.block[0]["row"] < self.screen_height: - state[self.block[0]["col"], self.block[0]["row"]] = 1 - - if self.block[1]["row"] < self.screen_height: - state[self.block[1]["col"], self.block[1]["row"]] = 1 - - return state - - def _draw_screen(self): - title = " Avg. Reward: %d Reward: %d Total Game: %d" % ( - self.total_reward / self.total_game, - self.current_reward, - self.total_game) - - self.axis.clear() - self.axis.set_title(title, fontsize=12) - - road = patches.Rectangle((self.road_left - 1, 0), - self.road_width + 1, self.screen_height, - line facecolor="#333333") - # 자동차, 장애물들을 1x1 크기의 정사각형으로 그리도록하며, 좌표를 기준으로 중앙에 위치시킵니다. - # 자동차의 경우에는 장애물과 충돌시 확인이 가능하도록 0.5만큼 아래쪽으로 이동하여 그립니다. - car = patches.Rectangle((self.car["col"] - 0.5, self.car["row"] - 0.5), - 1, 1, - linewidth="0," facecolor="#00FF00") - block1 = patches.Rectangle((self.block[0]["col"] - 0.5, self.block[0]["row"]), - 1, 1, - linewidth="0," facecolor="#0000FF") - block2 = patches.Rectangle((self.block[1]["col"] - 0.5, self.block[1]["row"]), - 1, 1, - linewidth="0," facecolor="#FF0000") - - self.axis.add_patch(road) - self.axis.add_patch(car) - self.axis.add_patch(block1) - self.axis.add_patch(block2) - - self.fig.canvas.draw() - # 게임의 다음 단계 진행을 위해 matplot 의 이벤트 루프를 잠시 멈춥니다. - plt.pause(0.0001) - - def reset(self): - """자동차, 장애물의 위치와 보상값들을 초기화합니다.""" - self.current_reward = 0 - self.total_game += 1 - - self.car["col"] = int(self.screen_width / 2) - - self.block[0]["col"] = random.randrange(self.road_left, self.road_right + 1) - self.block[0]["row"] = 0 - self.block[1]["col"] = random.randrange(self.road_left, self.road_right + 1) - self.block[1]["row"] = 0 - - self._update_block() - - return self._get_state() - - def _update_car(self, move): - """액션에 따라 자동차를 이동시킵니다. - - 자동차 위치 제한을 도로가 아니라 화면의 좌우측 끝으로 하고, - 도로를 넘어가면 패널티를 주도록 학습해서 도로를 넘지 않게 만들면 더욱 좋을 것 같습니다. - """ - - # 자동차의 위치가 도로의 좌측을 넘지 않도록 합니다: max(0, move)> 0 - self.car["col"] = max(self.road_left, self.car["col"] + move) - # 자동차의 위치가 도로의 우측을 넘지 않도록 합니다.: min(max, screen_width) < screen_width - self.car["col"] = min(self.car["col"], self.road_right) - - def _update_block(self): - """장애물을 이동시킵니다. - - 장애물이 화면 내에 있는 경우는 각각의 속도에 따라 위치 변경을, - 화면을 벗어난 경우에는 다시 방해를 시작하도록 재설정을 합니다. - """ - reward = 0 - - if self.block[0]["row"]> 0: - self.block[0]["row"] -= self.block[0]["speed"] - else: - self.block[0]["col"] = random.randrange(self.road_left, self.road_right + 1) - self.block[0]["row"] = self.screen_height - reward += 1 - - if self.block[1]["row"]> 0: - self.block[1]["row"] -= self.block[1]["speed"] - else: - self.block[1]["col"] = random.randrange(self.road_left, self.road_right + 1) - self.block[1]["row"] = self.screen_height - reward += 1 - - return reward - - def _is_gameover(self): - # 장애물과 자동차가 충돌했는지를 파악합니다. - # 사각형 박스의 충돌을 체크하는 것이 아니라 좌표를 체크하는 것이어서 화면에는 약간 다르게 보일 수 있습니다. - if ((self.car["col"] == self.block[0]["col"] and - self.car["row"] == self.block[0]["row"]) or - (self.car["col"] == self.block[1]["col"] and - self.car["row"] == self.block[1]["row"])): - - self.total_reward += self.current_reward - - return True - else: - return False - - def step(self, action): - # action: 0: 좌, 1: 유지, 2: 우 - # action - 1 을 하여, 좌표를 액션이 0 일 경우 -1 만큼, 2 일 경우 1 만큼 옮깁니다. - self._update_car(action - 1) - # 장애물을 이동시킵니다. 장애물이 자동차에 충돌하지 않고 화면을 모두 지나가면 보상을 얻습니다. - escape_reward = self._update_block() - # 움직임이 적을 경우에도 보상을 줘서 안정적으로 이동하는 것 처럼 보이게 만듭니다. - stable_reward = 1. / self.screen_height if action == 1 else 0 - # 게임이 종료됐는지를 판단합니다. 자동차와 장애물이 충돌했는지를 파악합니다. - gameover = self._is_gameover() - - if gameover: - # 장애물에 충돌한 경우 -2점을 보상으로 줍니다. 장애물이 두 개이기 때문입니다. - # 장애물을 회피했을 때 보상을 주지 않고, 충돌한 경우에만 -1점을 주어도 됩니다. - reward = -2 - else: - reward = escape_reward + stable_reward - self.current_reward += reward - - if self.show_game: - self._draw_screen() - - return self._get_state(), reward, gameover diff --git a/10 - DQN/pyplot/logs/events.out.tfevents.1497009719.mpr b/10 - DQN/pyplot/logs/events.out.tfevents.1497009719.mpr deleted file mode 100644 index a60bee71..00000000 Binary files a/10 - DQN/pyplot/logs/events.out.tfevents.1497009719.mpr and /dev/null differ diff --git a/10 - DQN/pyplot/model.py b/10 - DQN/pyplot/model.py deleted file mode 100644 index 9e36ddd4..00000000 --- a/10 - DQN/pyplot/model.py +++ /dev/null @@ -1,149 +0,0 @@ -# 알파고를 만든 구글의 딥마인드의 논문을 참고한 DQN 모델을 생성합니다. -# 딥마인드의 논문에서는 신경망 모델을 CNN 모델을 사용하지만, 여기서는 간단히 기본적인 신경망 모델을 사용합니다. -# http://www.nature.com/nature/journal/v518/n7540/full/nature14236.html -import tensorflow as tf -import numpy as np -import random -from collections import deque - - -class DQN: - # 학습에 사용할 플레이결과를 얼마나 많이 저장해서 사용할지를 정합니다. - # (플레이결과 = 게임판의 상태 + 취한 액션 + 리워드 + 종료여부) - REPLAY_MEMORY = 10000 - # 학습시 사용/계산할 상태값(정확히는 replay memory)의 갯수를 정합니다. - BATCH_SIZE = 32 - # 과거의 상태에 대한 가중치를 줄이는 역할을 합니다. - GAMMA = 0.99 - # 한 번에 볼 총 프레임 수 입니다. - # 앞의 상태까지 고려하기 위함입니다. - STATE_LEN = 4 - - def __init__(self, session, width, height, n_action): - self.session = session - self.n_action = n_action - self.width = width - self.height = height - # 게임 플레이결과를 저장할 메모리 - self.memory = deque() - # 현재 게임판의 상태 - self.state = None - - # 게임의 상태를 입력받을 변수 - # [게임판의 가로 크기, 게임판의 세로 크기, 게임 상태의 갯수(현재+과거+과거..)] - self.input_X = tf.placeholder(tf.float32, [None, width, height, self.STATE_LEN]) - # 각각의 상태를 만들어낸 액션의 값들입니다. 0, 1, 2 .. - self.input_A = tf.placeholder(tf.int64, [None]) - # 손실값을 계산하는데 사용할 입력값입니다. train 함수를 참고하세요. - self.input_Y = tf.placeholder(tf.float32, [None]) - - self.Q_value = self._build_network('main') - self.cost, self.train_op = self._build_op() - - # 학습을 더 잘 되게 하기 위해, - # 손실값 계산을 위해 사용하는 타겟(실측값)의 Q value를 계산하는 네트웍을 따로 만들어서 사용합니다 - self.target_Q_value = self._build_network('target') - - def _build_network(self, name): - with tf.variable_scope(name): - model = tf.layers.conv2d(self.input_X, 32, [4, 4], padding='same', activation=tf.nn.relu) - model = tf.layers.conv2d(model, 64, [2, 2], padding='same', activation=tf.nn.relu) - model = tf.contrib.layers.flatten(model) - model = tf.layers.dense(model, 512, activation=tf.nn.relu) - - Q_value = tf.layers.dense(model, self.n_action, activation=None) - - return Q_value - - def _build_op(self): - # DQN 의 손실 함수를 구성하는 부분입니다. 다음 수식을 참고하세요. - # Perform a gradient descent step on (y_j-Q(ð_j,a_j;θ))^2 - one_hot = tf.one_hot(self.input_A, self.n_action, 1.0, 0.0) - Q_value = tf.reduce_sum(tf.multiply(self.Q_value, one_hot), axis=1) - cost = tf.reduce_mean(tf.square(self.input_Y - Q_value)) - train_op = tf.train.AdamOptimizer(1e-6).minimize(cost) - - return cost, train_op - - # refer: https://github.com/hunkim/ReinforcementZeroToAll/ - def update_target_network(self): - copy_op = [] - - main_vars = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, scope='main') - target_vars = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, scope='target') - - # 학습 네트웍의 변수의 값들을 타겟 네트웍으로 복사해서 타겟 네트웍의 값들을 최신으로 업데이트합니다. - for main_var, target_var in zip(main_vars, target_vars): - copy_op.append(target_var.assign(main_var.value())) - - self.session.run(copy_op) - - def get_action(self): - Q_value = self.session.run(self.Q_value, - feed_dict={self.input_X: [self.state]}) - - action = np.argmax(Q_value[0]) - - return action - - def init_state(self, state): - # 현재 게임판의 상태를 초기화합니다. 앞의 상태까지 고려한 스택으로 되어 있습니다. - state = [state for _ in range(self.STATE_LEN)] - # axis=2 는 input_X 의 값이 다음처럼 마지막 차원으로 쌓아올린 형태로 만들었기 때문입니다. - # 이렇게 해야 컨볼루션 레이어를 손쉽게 이용할 수 있습니다. - # self.input_X = tf.placeholder(tf.float32, [None, width, height, self.STATE_LEN]) - self.state = np.stack(state, axis=2) - - def remember(self, state, action, reward, terminal): - # 학습데이터로 현재의 상태만이 아닌, 과거의 상태까지 고려하여 계산하도록 하였고, - # 이 모델에서는 과거 3번 + 현재 = 총 4번의 상태를 계산하도록 하였으며, - # 새로운 상태가 들어왔을 때, 가장 오래된 상태를 제거하고 새로운 상태를 넣습니다. - next_state = np.reshape(state, (self.width, self.height, 1)) - next_state = np.append(self.state[:, :, 1:], next_state, axis=2) - - # 플레이결과, 즉, 액션으로 얻어진 상태와 보상등을 메모리에 저장합니다. - self.memory.append((self.state, next_state, action, reward, terminal)) - - # 저장할 플레이결과의 갯수를 제한합니다. - if len(self.memory)> self.REPLAY_MEMORY: - self.memory.popleft() - - self.state = next_state - - def _sample_memory(self): - sample_memory = random.sample(self.memory, self.BATCH_SIZE) - - state = [memory[0] for memory in sample_memory] - next_state = [memory[1] for memory in sample_memory] - action = [memory[2] for memory in sample_memory] - reward = [memory[3] for memory in sample_memory] - terminal = [memory[4] for memory in sample_memory] - - return state, next_state, action, reward, terminal - - def train(self): - # 게임 플레이를 저장한 메모리에서 배치 사이즈만큼을 샘플링하여 가져옵니다. - state, next_state, action, reward, terminal = self._sample_memory() - - # 학습시 다음 상태를 만들어 낸 Q value를 입력값으로 - # 타겟 네트웍의 Q value를 실측값으로하여 학습합니다 - Q_value = self.session.run(self.target_Q_value, - feed_dict={self.input_X: next_state}) - - # DQN 의 손실 함수에 사용할 핵심적인 값을 계산하는 부분입니다. 다음 수식을 참고하세요. - # if episode is terminates at step j+1 then r_j - # otherwise r_j + γ*max_a'Q(ð_(j+1),a';θ') - # input_Y 에 들어갈 값들을 계산해서 넣습니다. - Y = [] - for i in range(self.BATCH_SIZE): - if terminal[i]: - Y.append(reward[i]) - else: - Y.append(reward[i] + self.GAMMA * np.max(Q_value[i])) - - self.session.run(self.train_op, - feed_dict={ - self.input_X: state, - self.input_A: action, - self.input_Y: Y - }) diff --git a/10 - DQN/pyplot/model/checkpoint b/10 - DQN/pyplot/model/checkpoint deleted file mode 100644 index 1d0e1505..00000000 --- a/10 - DQN/pyplot/model/checkpoint +++ /dev/null @@ -1,6 +0,0 @@ -model_checkpoint_path: "dqn.ckpt-1708830" -all_model_checkpoint_paths: "dqn.ckpt-1013377" -all_model_checkpoint_paths: "dqn.ckpt-1092695" -all_model_checkpoint_paths: "dqn.ckpt-1205475" -all_model_checkpoint_paths: "dqn.ckpt-1340046" -all_model_checkpoint_paths: "dqn.ckpt-1708830" diff --git a/10 - DQN/pyplot/model/dqn.ckpt-1013377.data-00000-of-00001 b/10 - DQN/pyplot/model/dqn.ckpt-1013377.data-00000-of-00001 deleted file mode 100644 index 66adf95c..00000000 Binary files a/10 - DQN/pyplot/model/dqn.ckpt-1013377.data-00000-of-00001 and /dev/null differ diff --git a/10 - DQN/pyplot/model/dqn.ckpt-1013377.index b/10 - DQN/pyplot/model/dqn.ckpt-1013377.index deleted file mode 100644 index 91aec827..00000000 Binary files a/10 - DQN/pyplot/model/dqn.ckpt-1013377.index and /dev/null differ diff --git a/10 - DQN/pyplot/model/dqn.ckpt-1013377.meta b/10 - DQN/pyplot/model/dqn.ckpt-1013377.meta deleted file mode 100644 index a5116949..00000000 Binary files a/10 - DQN/pyplot/model/dqn.ckpt-1013377.meta and /dev/null differ diff --git a/10 - DQN/pyplot/model/dqn.ckpt-1092695.data-00000-of-00001 b/10 - DQN/pyplot/model/dqn.ckpt-1092695.data-00000-of-00001 deleted file mode 100644 index 4d019ac3..00000000 Binary files a/10 - DQN/pyplot/model/dqn.ckpt-1092695.data-00000-of-00001 and /dev/null differ diff --git a/10 - DQN/pyplot/model/dqn.ckpt-1092695.index b/10 - DQN/pyplot/model/dqn.ckpt-1092695.index deleted file mode 100644 index f1cfeaff..00000000 Binary files a/10 - DQN/pyplot/model/dqn.ckpt-1092695.index and /dev/null differ diff --git a/10 - DQN/pyplot/model/dqn.ckpt-1092695.meta b/10 - DQN/pyplot/model/dqn.ckpt-1092695.meta deleted file mode 100644 index 58e1bb99..00000000 Binary files a/10 - DQN/pyplot/model/dqn.ckpt-1092695.meta and /dev/null differ diff --git a/10 - DQN/pyplot/model/dqn.ckpt-1205475.data-00000-of-00001 b/10 - DQN/pyplot/model/dqn.ckpt-1205475.data-00000-of-00001 deleted file mode 100644 index 237ccc3d..00000000 Binary files a/10 - DQN/pyplot/model/dqn.ckpt-1205475.data-00000-of-00001 and /dev/null differ diff --git a/10 - DQN/pyplot/model/dqn.ckpt-1205475.index b/10 - DQN/pyplot/model/dqn.ckpt-1205475.index deleted file mode 100644 index 27953121..00000000 Binary files a/10 - DQN/pyplot/model/dqn.ckpt-1205475.index and /dev/null differ diff --git a/10 - DQN/pyplot/model/dqn.ckpt-1205475.meta b/10 - DQN/pyplot/model/dqn.ckpt-1205475.meta deleted file mode 100644 index 4d0adcf0..00000000 Binary files a/10 - DQN/pyplot/model/dqn.ckpt-1205475.meta and /dev/null differ diff --git a/10 - DQN/pyplot/model/dqn.ckpt-1340046.data-00000-of-00001 b/10 - DQN/pyplot/model/dqn.ckpt-1340046.data-00000-of-00001 deleted file mode 100644 index 4e1b9864..00000000 Binary files a/10 - DQN/pyplot/model/dqn.ckpt-1340046.data-00000-of-00001 and /dev/null differ diff --git a/10 - DQN/pyplot/model/dqn.ckpt-1340046.index b/10 - DQN/pyplot/model/dqn.ckpt-1340046.index deleted file mode 100644 index d9d1168f..00000000 Binary files a/10 - DQN/pyplot/model/dqn.ckpt-1340046.index and /dev/null differ diff --git a/10 - DQN/pyplot/model/dqn.ckpt-1340046.meta b/10 - DQN/pyplot/model/dqn.ckpt-1340046.meta deleted file mode 100644 index 14af5875..00000000 Binary files a/10 - DQN/pyplot/model/dqn.ckpt-1340046.meta and /dev/null differ diff --git a/10 - DQN/pyplot/model/dqn.ckpt-1708830.data-00000-of-00001 b/10 - DQN/pyplot/model/dqn.ckpt-1708830.data-00000-of-00001 deleted file mode 100644 index 56da7293..00000000 Binary files a/10 - DQN/pyplot/model/dqn.ckpt-1708830.data-00000-of-00001 and /dev/null differ diff --git a/10 - DQN/pyplot/model/dqn.ckpt-1708830.index b/10 - DQN/pyplot/model/dqn.ckpt-1708830.index deleted file mode 100644 index ff5ccc00..00000000 Binary files a/10 - DQN/pyplot/model/dqn.ckpt-1708830.index and /dev/null differ diff --git a/10 - DQN/pyplot/model/dqn.ckpt-1708830.meta b/10 - DQN/pyplot/model/dqn.ckpt-1708830.meta deleted file mode 100644 index b2ac08e5..00000000 Binary files a/10 - DQN/pyplot/model/dqn.ckpt-1708830.meta and /dev/null differ diff --git a/10 - DQN/pyplot/screenshot_game.gif b/10 - DQN/pyplot/screenshot_game.gif deleted file mode 100644 index e41b8a39..00000000 Binary files a/10 - DQN/pyplot/screenshot_game.gif and /dev/null differ diff --git a/10 - DQN/pyplot/screenshot_tensorboard.png b/10 - DQN/pyplot/screenshot_tensorboard.png deleted file mode 100644 index 2932e2be..00000000 Binary files a/10 - DQN/pyplot/screenshot_tensorboard.png and /dev/null differ

AltStyle によって変換されたページ (->オリジナル) /