Vanilla-Policy-Cart-Pole
플레이한 history 리스트를 가지고 역순으로 순회하면서 discount factor를 적용하는 부분이 재미있었습니다.
def discount_rewards(r):
""" take 1D float array of rewards and compute discounted reward """
discounted_r = np.zeros_like(r)
running_add = 0
for t in reversed(xrange(0, r.size)):
running_add = running_add * gamma + r[t]
discounted_r[t] = running_add
return discounted_r
python에 익숙하지 않아, 이 부분도 갸우뚱 했는데요.
s1,r,d,_ = env.step(a) #Get our reward for taking an action given a bandit.
ep_history.append([s,a,r,s1])
ep_history = np.array(ep_history)
ep_history[:,2] = discount_rewards(ep_history[:,2])
ep_history[:,2]이 코드는
모든 행에 대해서 2 열 (reward) 만 split해옵니다.
[[s,a,r,s1],
[s,a,r,s1],
[s,a,r,s1]]
[r,r,r]
argmax(a_dist == a)
agent의 행동 가능한 액션 출력값이 확률과 같기 때문에
np.random.choice에 p argument로 자신의 begin을 넣는점이 재미있었고,
argmax에서 비교연산자를 통해 [True, False] 형태로 만들어 선택된 값을 뽑아오는데, explict loop하게 가져오는 부분도 재미있었습니다.
a_dist = sess.run(myAgent.output,feed_dict={myAgent.state_in:[s]})
a = np.random.choice(a_dist[0],p=a_dist[0])
a = np.argmax(a_dist == a)
self.indexes
self.state_in = tf.placeholder(shape=[None, s_size], dtype=tf.float32)
hidden = slim.fully_connected(self.state_in, h_size, biases_initializer=None, activation_fn=tf.nn.relu)
self.output = slim.fully_connected(hidden, a_size, biases_initializer=None, activation_fn = tf.nn.softmax)
self.chosen_action = tf.argmax(self.output,1)
self.reward_holder = tf.placeholder(shape=[None], dtype=tf.float32)
self.action_holder = tf.placeholder(shape=[None], dtype=tf.int32)
# 이 아래 코드가 잘 이해가지 않았엇는데요,
self.indexes = tf.range(0, tf.shape(self.output)[0]) * tf.shape(self.output)[1] + self.action_holder
self.responsible_outputs = tf.gather(tf.reshape(self.output, [-1]), self.indexes)
feed 되는 state_in 의 shape이 [None, s_size] 인것을 잘 살펴봐야했습니다.
feed_dict={myAgent.reward_holder:ep_history[:,2],
myAgent.action_holder:ep_history[:,1],myAgent.state_in:np.vstack(ep_history[:,0])}
grads = sess.run(myAgent.gradients, feed_dict=feed_dict)
간단하게 설명하면,
state 히스토리가 넘어오는데, 1차원 배열 형태로 넘어오게 됩니다.
각 state마다 할 수 있는 액션의 개수가 있죠?
2개의 state history가 feed되면 output으로 4개의 action policy 배열이 나오게됩니다.
Indexes는 출력된 4개의 output)에서 선택한 action의 index 값으로 세팅됩니다.
output : [0.1, 0.2, 0.3, 0.25]
indexes = [1 3]
# output 에서 1, 3 weight만을 pick!
self.responsible_outputs = tf.gather(tf.reshape(self.output, [-1]), self.indexes)
마지막으로 gather 함수를 통해, 선택 된 output tensor들만을 선택하게 됩니다.
이해를 돕기 위해 예제 코드 링크를 첨부합니다. :)
Reference Code Repo : https://github.com/awjuliani/DeepRL-Agents
'프로그래밍 > AI' 카테고리의 다른 글
Double-Dueling-dqn 분석 (0) | 2019.05.05 |
---|---|
Ubuntu Tensorflow-gpu 설치 (0) | 2019.05.05 |
Q-Network 코드 분석 (0) | 2019.04.28 |
Open AI Gym 시작하기 (0) | 2019.04.13 |
DQN 읽을 거리 (0) | 2019.04.13 |