ここのGithubレポジトリを見ながら、tensorflow
とKeras
を使用し、強化学習を勉強しております。
わからないこと
以下、一部コードを抜粋しておりますが
(1)のtf.squeeze(self.critic(states, actions), 1)
から、CriticNetwork
クラスの関数(3)が呼び出されます。
どのような仕組みで呼び出されているのか教えていただけますと大変助かります。
Agent
クラスのインスタンス化
↓
.learn
で(1)が呼び出される
↓
(2)self.critic = CriticNetwork(n_actions=n_actions, name='critic')
で、CriticNetwork
クラスがインスタンス化される
まではわかるのですが、そもそも、どこからもcall
という名前の関数を呼び出してないのです。
どのような仕組みなのでしょうか。
networks.py
import os import tensorflow as tf import tensorflow.keras as keras from tensorflow.keras.layers import Dense from tensorflow.keras.optimizers import Adam ######## 省略 ######## class CriticNetwork(keras.Model): def __init__(self, fc1_dims=512, fc2_dims=512, n_actions=2, name='critic', chkpt_dir='tmp/ddpg'): super(CriticNetwork, self).__init__() self.fc1_dims = fc1_dims self.fc2_dims = fc2_dims self.model_name = name self.checkpoint_dir = chkpt_dir self.checkpoint_file = os.path.join(self.checkpoint_dir, self.model_name+'_ddpg.h5') self.fc1 = Dense(self.fc1_dims, activation='relu') self.fc2 = Dense(self.fc2_dims, activation='relu') self.q = Dense(1, activation=None) ###### (3) ####### def call(self, state, action): action_value = self.fc1(tf.concat([state, action], axis=1)) action_value = self.fc2(action_value) q = self.q(action_value) return q
ddpg_tf2.py
class Agent: def __init__(self, input_dims, alpha=0.001, beta=0.002, env=None, gamma=0.99, n_actions=2, max_size=1_000_000, tau=0.005, fc1=400, fc2=300, batch_size=64, noise=0.1): self.gamma = gamma self.tau = tau self.memory = ReplayBuffer(max_size, input_dims, n_actions) self.batch_size = batch_size self.n_actions = n_actions self.noise = noise self.max_action = env.action_space.high[0] self.min_action = env.action_space.low[0] # 各NNのインスタンス化 self.actor = ActorNetwork(n_actions=n_actions, name='actor') ######## (2) ######### self.critic = CriticNetwork(n_actions=n_actions, name='critic') ####################### self.target_actor = ActorNetwork(n_actions=n_actions, name='target_actor') self.target_critic = CriticNetwork(n_actions=n_actions, name='target_critic') # 各NNをcompile self.actor.compile(optimizer=Adam(learning_rate=alpha)) self.critic.compile(optimizer=Adam(learning_rate=beta)) self.target_actor.compile(optimizer=Adam(learning_rate=alpha)) self.target_critic.compile(optimizer=Adam(learning_rate=beta)) self.update_network_parameters(tau=1) # def learn(self): if self.memory.mem_cntr < self.batch_size: return state, action, reward, new_state, done = self.memory.sample_buffer(self.batch_size) states = tf.convert_to_tensor(state, dtype=tf.float32) states_ = tf.convert_to_tensor(new_state, dtype=tf.float32) rewards = tf.convert_to_tensor(reward, dtype=tf.float32) actions = tf.convert_to_tensor(action, dtype=tf.float32) # CRITIC LOSSの算出 with tf.GradientTape() as tape: target_actions = self.target_actor(states_) critic_value_ = tf.squeeze(self.target_critic(states_, target_actions), 1) ######## (1) ######### critic_value = tf.squeeze(self.critic(states, actions), 1) ###################### target = reward + self.gamma*critic_value_*(1-done) critic_loss = keras.losses.MSE(target, critic_value) critic_network_gradient = tape.gradient(critic_loss, self.critic.trainable_variables) self.critic.optimizer.apply_gradients(zip(critic_network_gradient, self.critic.trainable_variables)) # ACTOR LOSSの算出 with tf.GradientTape() as tape: new_policy_actions = self.actor(states) actor_loss = -self.critic(states, new_policy_actions) actor_loss = tf.math.reduce_mean(actor_loss) actor_network_gradient = tape.gradient(actor_loss, self.actor.trainable_variables) self.actor.optimizer.apply_gradients(zip(actor_network_gradient, self.actor.trainable_variables))
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/02/27 10:01
退会済みユーザー
2021/02/27 10:48 編集
2021/02/27 12:59