DDPG by gymnasium 5日目

次回は、actorNNへの引数修正、それに伴うagentDDPG引数修正、そしてリプレイバッファへの保存内容を修正しました。

今回は64データ集まった後に学習learn()メソドが走るとエラーが出るので修正していきます。

Contents

chatGPTより

このエラーメッセージは、F.linear関数を使用して乗算されている2つのテンソルのデータ型が一致しないことを示しています。この場合、inputテンソルとweightテンソルのデータ型が異なるようです。

この問題を解決するには、次の手順を試すことができます。

  1. inputテンソルとweightテンソルのデータ型を確認します。それらのdtype属性を出力して、同じかどうかを確認できます。
  2. データ型が異なる場合は、to()メソッドを使用してinputテンソルをweightテンソルと同じデータ型に変換します。たとえば、weightテンソルがfloat32テンソルの場合、input.to(torch.float32)を呼び出してinputテンソルをfloat32テンソルに変換できます。
  3. 代わりに、inputテンソルと同じデータ型にweightテンソルを変換することもできます。たとえば、inputテンソルがfloat64テンソルの場合、weight.to(torch.float64)を呼び出してweightテンソルをfloat64テンソルに変換できます。
  4. テンソル上で行われる他の操作も同じデータ型を維持するようにしてください。

テンソルのデータ型が一貫していることを確認することで、遭遇したRuntimeErrorを解決できるはずです。

とのこと。なるほど、入力データをpytorchの型に合わせる必要があるようです。

現状確認

データを保存するときにstore_transitionメソドで

        self.state_memory[index] = obs.detach().numpy().flatten()
        self.action_memory[index] = action.flatten()
        self.reward_memory[index] = reward.flatten()
        self.next_state_memory[index] = next_state.flatten()
        self.terminal_memory[index] = 1 – int(done)
としているので、type()で型を見てみます。
        print(‘type of state_memory :’, type(self.state_memory[0][0]))
        print(‘type of action_memory :’, type(self.action_memory[0][0]))
        print(‘type of reward_memory :’, type(self.reward_memory[0]))
        print(‘type of next_state_memory :’, type(self.next_state_memory[0][0]))
        print(‘type of memory.state_memory :’, type(self.terminal_memory[0]))
結果、値は 全てnumpy.float64になっています。
type of state_memory : <class ‘numpy.float64’>
type of action_memory : <class ‘numpy.float64’>
type of reward_memory : <class ‘numpy.float64’>
type of next_state_memory : <class ‘numpy.float64’>
type of memory.state_memory : <class ‘numpy.float64’>
取り出す際もsample_buffer(self, batch_size)メソドで
observations = self.state_memory[choosed_index]
として戻り値を得ているので変わりません。
戻り値はpytorchのテンソルに変換しています。troch.float64になっている。
        observations = T.tensor(observations, dtype=float)
        actions = T.tensor(actions, dtype=float)
        rewards = T.tensor(rewards, dtype=float)
        next_states = T.tensor(next_states, dtype=float)
        terminals = T.tensor(terminals, dtype=float)
それを
target_actions = self.target_actor.forward(next_states)
に入れたときに起こっているのか?
class ActorNN(nn.Module):
__init__: self.fc1 = nn.Linear(n_obs_space, layer1_size)
forward :      x = self.fc1(obs) ここでエラーが発生している
 obsはバッチサイズ64x観察空間17、を入力ノード17x次層ノード64で待ち受けている。数としては問題ない。
型が合わないということなので、重みパラメータの型を調べてみる
agent.actor.fc1.weight.dtype → torch.float32
agent.target_actor.fc1.weight.dtype → torch.float32
なるほど、torch.float32で入力しなければならないようなので、変更します。
修正前:observations = T.tensor(observations, dtype=float)
修正後:observations = T.tensor(observations, dtype=T.float32)
これで回るようになりました。

ここまでのスクリプト

target_actorへnext_states  バッチサイズ64データを入力し、target_actions 64データを得ることができました。
以降、actorが1ステップ行動するごとに、target_actorへnext_states 64データを入力してtarget_actions 64データを繰り返し出力する状態になりました。
次回は、このtarget_actionsをnext_statesと共にtarget_criticへ入力するところからやっていきます。