第二版本嘗試
第三版本嘗試
**目錄:
打磚塊是gym遊戲中相對複雜一些的遊戲,不同於cartpole遊戲,狀態空間較少,基本上10分鐘左右訓練就可以玩到最高分,打磚塊要訓練非常長的時間,因此對於更進一步去理解和優化dqn非常有幫助。
打磚塊的reward設定是敲打到磚塊:reward = 1
5次球都未接到或者全部磚塊打完了done = 1
state就是整個遊戲中的全體畫素
單張很難表述出球運動的方向,為了更好的表現出遊戲中的狀態就需要連續多張,這裡我取了連續4張。
這裡貼出**,先使用三層卷積網路降維後
def
create_q_network
(self)
:# network weights
input_layer = input(shape=
(img_size,img_size,4)
, name=
"unet_input"
)#converlution
cnn1 = convolution2d(nb_filter=
32, nb_row=
8, nb_col=
8, border_mode=
'same'
, subsample=(4
,4))
(input_layer)
cnn1 = relu(
)(cnn1)
cnn2 = convolution2d(nb_filter=
64, nb_row=
4, nb_col=
4, border_mode=
'same'
, subsample=(2
,2))
(cnn1)
cnn2 = relu(
)(cnn2)
cnn2 = convolution2d(nb_filter=
64, nb_row=
3, nb_col=
3, border_mode=
'same'
, subsample=(1
,1))
(cnn1)
cnn2 = relu(
)(cnn2)
#full connect
fc0 = flatten(
)(cnn2)
fc1 = dense(
512)
(fc0)
#get q_value
q_value= dense(self.action_dim)
(fc1)
self.model = model(
input
=[input_layer]
, output=
[q_value]
, name=
'q_net'
) self.model.
compile
(loss=
'mse'
,optimizer=adam(lr=self.learning_rate)
)
由於第一版讀取整個,且需要連續4幀,在處理環節就需要消耗大量時間,且獲得得資訊其實與真正桌球相關得只有球得座標以及板子的位置,且僅需要兩幀就可以用於表述需要的狀態,因此我改進了狀態變數的,之用了4個維度。
def
preprocess
(img)
: img_temp = img.mean(axis =2)
# img_temp = cv2.resize(img_temp,(img_size,img_size))
x =-1
y =-1
flag =0if
len(np.where(
(img_temp[
100:
189,8:
152])!=
0)[0
])!=0
: x = np.where(
(img_temp[
100:
189,8:
152])!=
0)[0
][0]
y = np.where(
(img_temp[
100:
189,8:
152])!=
0)[1
][0]
iflen
(np.where(
(img_temp[
193:,8
:152])
!=0)[
0])!=
0:x = np.where(
(img_temp[
193:,8
:152])
!=0)[
0][0
]+93 y = np.where(
(img_temp[
193:,8
:152])
!=0)[
1][0
] flag =
1# x = -2
# y = -2
p =int(np.where(img_temp[
191:
193,8:
152])[
1].mean()-
7.5)
#return img_temp
return
(x,y,p,flag)
for step in
range
(step)
:print
("episode:%d step:%d"
%(episode,step)
) action = agent.egreedy_action(state_shadow)
next_state,reward,done,_ = env.step(action)
(x2,y2,p2,flag)
= preprocess(next_state)
next_state_shadow = np.array(
[x1,y1,x2,y2,p2]
)# define reward for agent
#reward_agent = -1 if done else 0.1
#加大落下的懲罰
if flag ==1:
reward =-10
done =
true
else
: reward =
0.1 agent.perceive(state_shadow,action,reward,next_state_shadow,done)
# if cur_loss is not none:
# total_loss += cur_loss
total_reward += reward
state_shadow = next_state_shadow
x1,y1,p1 = x2,y2,p2
if done:
break
經過14000 episode的迭代的效果如下:
測試出的reward雖然整體有上公升的趨勢但:
引入prioritised,改變訓練樣本的權重。訓練了差多15個小時左右,平均收益任然不是很理想,不過玩起來的感覺還不錯了
強化學習 強化學習基礎
為了應對車載網路中通訊環境快速變化的難題,可以使用強化學習進行解決,這裡對強化學習的基礎進行整理。主要的應用場景為車載網路中資源分配問題。本文源自莫煩python 強化學習章節,有需要請查閱原文 20200413補充了一些內容,來自這篇部落格,是李巨集毅的深度強化學習的筆記。強化學習的主要構成有 a...
強化學習 1 1 0 強化學習介紹
abstract 本文介紹reinforcement learning的具體特點和與其他機器學習演算法不同之處,本文是乙個骨架性的文章,所有專有名詞都保持英文原始單詞,具體內容會在後續中給出詳細解答。keywords reinforcement learning,situation,action,e...
強化學習系列1 強化學習簡介
2015年10月,alphago在和歐洲冠軍進行的圍棋賽上獲得了5 0的完勝,其後的深度強化學習也隨之火了起來。從本期開始開個新坑,一步步把強化學習的內容捋一遍。強化學習 reinforcement learning 是用來解決連續決策問題的一種方法。針對的模型是馬爾科夫決策過程 markov de...