tensorflow增強學習應用於乙個小遊戲

2022-02-17 04:43:15 字數 3042 閱讀 6064

首先需要安裝gym模組,提供遊戲的。

1,所需模組

import

tensorflow as tf

import

numpy as np

import

gymimport

random

from collections import

deque

from keras.utils.np_utils import to_categorical

2,自定義乙個簡單的3層dense model

#

自定義model

class

qnetwork(tf.keras.model):

def__init__

(self):

super().

__init__()#

簡單的3個dense

self.dense1=tf.keras.layers.dense(24,activation='

relu')

self.dense2=tf.keras.layers.dense(24,activation='

relu')

self.dense3=tf.keras.layers.dense(2)

defcall(self,inputs):

x=self.dense1(inputs)

x=self.dense2(x)

x=self.dense3(x)

return

x

defpredict(self,inputs):

q_values=self(inputs)#

呼叫call

return tf.argmax(q_values,axis=-1)

3,定義相關引數

#

遊戲環境,例項化乙個遊戲

env=gym.make('

cartpole-v1')

model=qnetwork()

#迴圈輪數設定小一點,50就可以了

num_episodes=500num_exploration=100max_len=1000batch_size=32lr=1e-3gamma=1.

initial_epsilon=1.

final_epsilon=0.01replay_buffer=deque(maxlen=10000)

epsilon=initial_epsilon

#tensorflow2.0

optimizer=tf.compat.v1.train.adamoptimizer(learning_rate=lr)

4,訓練,測試

for i in

range(num_episodes):

#初始化環境

state=env.reset()

#逐漸衰減,至final_epsilon

epsilon=max(initial_epsilon*(num_exploration-i)/num_exploration,final_epsilon)

for t in

range(max_len):

#當前幀繪製到螢幕

env.render()

#以epsilon的概率隨機行動,epsilon是衰減的,說明遊戲動作會越來越穩定

if random.random()action=env.action_space.sample()

else:#

從當前狀態**乙個動作

action=model.predict(tf.constant(np.expand_dims(state,axis=0),dtype=tf.float32)).numpy()

action=action[0]

#執行一步動作

next_state,reward,done,info=env.step(action)#獎勵

reward=-10.if done else

reward#快取

state=next_state

ifdone:

print('

episode %d,epsilon %f,score %d

'%(i,epsilon,t))

break

#**batch_size步後執行

if len(replay_buffer)>=batch_size:

#隨機獲取乙個batch的資料

batch_state,batch_action,batch_reward,batch_next_state,batch_done=\

[np.array(a,dtype=np.float32) for a in zip(*random.sample(replay_buffer,batch_size))]

#下乙個狀態,由此得到的y為真實值

#**值與真實值的計算看不太懂

q_value=model(tf.constant(batch_next_state,dtype=tf.float32))

y=batch_reward+(gamma*tf.reduce_max(q_value,axis=1))*(1-batch_done)

with tf.gradienttape() as tape:

#loss=tf.losses.mean_squared_error(labels=y,predictions=tf.reduce_sum(

#model(tf.constant(batch_state))*tf.one_hot(batch_action,depth=2),axis=1))

loss=tf.losses.mean_squared_error(y,tf.reduce_sum(

model(tf.constant(batch_state))*to_categorical(batch_action,num_classes=2),axis=1))

grads=tape.gradient(loss,model.variables)

最終會出現乙個視窗,平衡遊戲不斷進行。。。

上面注釋部分因為tf.one_hot方法會報錯。

TensorFlow2學習八之資料增強

影象增強 對影象的簡單形變。tensorflow2影象增強函式tf.keras.preprocessing.image.imagedatagenerator image gen train tf.keras.preprocessing.image.imagedatagenerator rescale...

tensorflow 學習 學習中

基於 virtualenv 的安裝 在 linux 上 sudo apt get install python pip python dev python virtualenv 在 mac 上 sudo easy install pip 如果還沒有安裝 pip sudo pip install up...

tensorflow學習筆記

tensorflow安裝可以直接通過命令列或者原始碼安裝,在此介紹tensorflow8命令列安裝如下 安裝tensorflow sudo pip install upgrade 另外,解除安裝tensorflow命令為 sudo pip uninstall tensorflow tensorflo...