post Image
ChainerRLでライントレーサーする

ということでChainerの強化学習版ChainerRLが公開されていました。

このところ手を広げすぎていて中々丁寧な仕事ができない中、
30分 x 2日でDouble DQNでライントレーサーできました。ライブラリ便利で助かる!

使用環境

  • Windows 10 – 64bit            <諦めが悪い心の強さ…!>
  • Python 3.6.0 |Anaconda 4.3.0 (64-bit)     <プライドより実利!>

環境&サンプル リポジトリ

Chachay/Gym_LineFollower: Simple Open AI gym like Environment

GUI tool kitをQt5化しました

ChainerRL

pipで入れようとすると Arcade Learning Environment入れようとしてコケる。
ALEをWindowsに突っ込むところに時間をかけてもいいけど、
Windowsでpongしたいとも思わないので、ショートカット!!

1. GitHubからリポジトリを落とす

GitHub – pfnet/chainerrl: ChainerRL is a deep reinforcement learning library built on top of Chainer.

2. 同梱のChainerRLフォルダを作業フォルダに移す

以降のexampl2.pyと同じフォルダね

ライントレーサー環境定義

ライントレーサーの環境をOpenAI I/F的にした – Qiitaの環境は、ライントレーサーが受け取る車輪速度を連続値で環境を定義しています。

これを離散値にするため、継承で離散値環境にしなおします。
同時に一つ目センシングを4ステップ分の履歴観測にします。

class SState(object):
    def __init__(self, STATE_NUM, DIM):
        self.STATE_NUM = STATE_NUM
        self.DIM = DIM
        self.seq = np.zeros((STATE_NUM, DIM), dtype=np.float32)

    def push_s(self, state):
        self.seq[1:self.STATE_NUM ] = self.seq[0:self.STATE_NUM -1]
        self.seq[0] = state

    def reset(self):
        self.seq = np.zeros_like(self.seq)

    def fill_s(self, state):
        for i in range(0, self.STATE_NUM):
            self.seq[i] = state

# Define Agent And Environment
class LineTracerEnvDiscrete(LineTracerEnv):
    actions = np.array([[0.5, 0.1], [1.0, 1.0],  [0.1, 0.5]]) 
    OBSDIM = 4

    def __init__(self):
        self.action_space_d = spaces.Discrete(self.actions.shape[0])
        self.observation_space_d = spaces.Discrete(self.OBSDIM)
        self.MyState = SState(self.OBSDIM, 1)

        super().__init__()

    def _step(self, action):
        tempState, tmpReward, tmpDone, tmpInfo = super()._step(self.actions[action])
        self.MyState.push_s(tempState)
        return self.MyState.seq.flatten(), tmpReward, tmpDone, tmpInfo

    def _reset(self):
        s = super()._reset()
        self.MyState.reset()
        return self.MyState.seq.flatten()

env = LineTracerEnvDiscrete()

あとは藤田さん(@mooopann)のクイックスタートからコピペ・コピペ

env.OBSDIM, env.action_space_d.nとenv.action_space_d.sampleだけ若干注意。

q_func = chainerrl.q_functions.FCStateQFunctionWithDiscreteAction(
    env.OBSDIM, env.action_space_d.n,
    n_hidden_layers=2, n_hidden_channels=50)

optimizer = chainer.optimizers.Adam(eps=1e-2)
optimizer.setup(q_func)

gamma = 0.95

explorer = chainerrl.explorers.ConstantEpsilonGreedy(
    epsilon=0.3, random_action_func=env.action_space_d.sample)

replay_buffer = chainerrl.replay_buffer.ReplayBuffer(capacity=10 ** 6)

agent = chainerrl.agents.DoubleDQN(
    q_func, optimizer, replay_buffer, gamma, explorer,
    replay_start_size=500, update_frequency=1,
    target_update_frequency=100)

実行

動く…!

python example2.py

20170221.png

※ 周回路回れるような行動を学習できたかは…試してないっす
そのあたりは過去記事を… ⇒ ライントレーサーをDeep Q Learningで教育する – Chainer – Qiita

感想

初日:正味30分

2日目:正味30分

  • Envの継承クラス作成
  • 動いた

まとめ

  • エージェントづくりが捗りまくって素晴らしい
  • pipにてWindowsで蹴られないような気づかいはいただきたい
  • やっぱり↓はある

スクリプト

Chachay/Gym_LineFollower: Simple Open AI gym like Environment

example2.py参照のこと


『 機械学習 』Article List
Category List

Eye Catch Image
Read More

Androidに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

AWSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Bitcoinに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

CentOSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

dockerに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

GitHubに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Goに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Javaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

JavaScriptに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Laravelに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Pythonに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Rubyに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Scalaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Swiftに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Unityに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Vue.jsに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Wordpressに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

機械学習に関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。