質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.48%

Keras-rlで画像を扱ったときの形状があわない

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 653

score 14

Keras-RLを用いた深層強化学習コト始め 
https://qiita.com/panchovie/items/af9bac0e8ad8945bdf09 という記事のプログラムを再現したい思っているのですが、エラーの中にでてくる(1, 1, 3)が何なのかがよくわからずうまく動かすことができません。できればお教えしていただきたいです。

img_size = 128
channel = 3

class PendulumProcessor(Processor):
    def __init__(self):
        self.rgb_state = np.zeros((img_size, img_size, channel))

    # 状態(x,y座標)から対応画像を描画する関数
    def _get_rgb_state(self, state):

        h_size = img_size/2.0

        img = Image.new("RGB", (img_size, img_size), (255, 255, 255))
        dr = ImageDraw.Draw(img)

        # 棒の長さ
        l = img_size/4.0 * 3.0/ 2.0

        # 棒のラインの描写
        dr.line(((h_size - l * state[1], h_size - l * state[0]), (h_size, h_size)), (0, 0, 0), 1)

        # 棒の中心の円を描写(それっぽくしてみた)
        buff = img_size/32.0
        dr.ellipse(((h_size - buff, h_size - buff), (h_size + buff, h_size + buff)), 
                   outline=(0, 0, 0), fill=(255, 0, 0))

        # 画像の一次元化(GrayScale化)とarrayへの変換
        pilImg = img.convert("L")
        img_arr = np.asarray(pilImg)

        # 画像の規格化
        img_arr = img_arr/255.0

        return img_arr


    # Gym環境の出力と、Duel-DQNアルゴリズムへの入力との違いを吸収
    def process_step(self, observation, reward, done, info):

        old_rgb_state = self.rgb_state.copy()

        # アルゴリズムの状態入力として、画像を用いる(過去3フレームを入力する)
        # 直近の状態に対応する画像を作成
        self.rgb_state[:, :, 0] = self.self._get_rgb_state(observation)
        # 過去2フレームも保持
        for i in range(1, channel):
            self.rgb_state[:, :, i] = old_rgb_state[:, :, i-1] # shift old state

        # アルゴリズムへの報酬として、設定課題に沿った報酬を用いる(上記通り)
        reward = self.process_reward(reward)

        return self.rgb_state, reward, done, info

    # Duel-DQNの出力と、Gym環境の入力の違いを吸収
    def process_action(self, action):
        return ACT_ID_TO_VALUE[action]

    # Gym環境の報酬の出力と、Duel-DQNの報酬の入力との違いを吸収
    def process_reward(self, reward):
        if reward > -0.2:
            return 1
        elif reward > -1.0:
            return 0
        else:
            return 0   

processor = PendulumProcessor()  
print(processor.rgb_state.shape) #(128,128,3)  
# 画像の特徴量抽出ネットワークのパラメタ
n_filters = 32
kernel = (3, 3)
strides = (2, 2)

model = Sequential()
# 畳込み層による画像の特徴量抽出ネットワーク
model.add(Reshape((img_size, img_size, channel), input_shape=(1, img_size, img_size, channel)))
model.add(Conv2D(n_filters, kernel, strides=strides, padding="same", activation="relu"))
model.add(Conv2D(n_filters, kernel, strides=strides, padding="same", activation="relu"))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(n_filters, kernel, strides=strides, padding="same", activation="relu"))
model.add(Conv2D(n_filters, kernel, strides=strides, padding="same", activation="relu"))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
# 以前と同様の2層FCのQ関数ネットワーク
model.add(Dense(16, activation="relu"))
model.add(Dense(16, activation="relu"))
model.add(Dense(nb_actions, activation="linear"))
memory = SequentialMemory(limit=50000, window_length=1)
policy = BoltzmannQPolicy()

# Duel-DQNのAgentクラスオブジェクトの準備 (上記processorやmodelを元に)
dqn = DQNAgent(model=model, nb_actions=nb_actions, memory=memory, nb_steps_warmup=10,
               enable_dueling_network=True, dueling_type="avg", target_model_update=1e-2, policy=policy,
               processor=processor)
print(dqn.model.summary())
dqn.compile(Adam(lr=1e-3), metrics=["mae"])
history = dqn.fit(env, nb_steps=1000, visualize=False, verbose=2) #エラーがでているところ
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-19-f4b86796f9d8> in <module>()
     14 print(dqn.model.summary())
     15 dqn.compile(Adam(lr=1e-3), metrics=["mae"])
---> 16 history = dqn.fit(env, nb_steps=1000, visualize=False, verbose=2)

6 frames
/usr/local/lib/python3.6/dist-packages/rl/core.py in fit(self, env, nb_steps, action_repetition, callbacks, verbose, visualize, nb_max_start_steps, start_step_policy, log_interval, nb_max_episode_steps)
    167                 # This is were all of the work happens. We first perceive and compute the action
    168                 # (forward step) and then use the reward to improve (backward step).
--> 169                 action = self.forward(observation)
    170                 if self.processor is not None:
    171                     action = self.processor.process_action(action)

/usr/local/lib/python3.6/dist-packages/rl/agents/dqn.py in forward(self, observation)
    227         # Select an action.
    228         state = self.memory.get_recent_state(observation)
--> 229         q_values = self.compute_q_values(state)
    230         if self.training:
    231             action = self.policy.select_action(q_values=q_values)

/usr/local/lib/python3.6/dist-packages/rl/agents/dqn.py in compute_q_values(self, state)
     68 
     69     def compute_q_values(self, state):
---> 70         q_values = self.compute_batch_q_values([state]).flatten()
     71         assert q_values.shape == (self.nb_actions,)
     72         return q_values

/usr/local/lib/python3.6/dist-packages/rl/agents/dqn.py in compute_batch_q_values(self, state_batch)
     63     def compute_batch_q_values(self, state_batch):
     64         batch = self.process_state_batch(state_batch)
---> 65         q_values = self.model.predict_on_batch(batch)
     66         assert q_values.shape == (len(state_batch), self.nb_actions)
     67         return q_values

/usr/local/lib/python3.6/dist-packages/keras/engine/training.py in predict_on_batch(self, x)
   1572             Numpy array(s) of predictions.
   1573         
-> 1574         x, _, _ = self._standardize_user_data(x)
   1575         if self._uses_dynamic_learning_phase():
   1576             ins = x + [0]

/usr/local/lib/python3.6/dist-packages/keras/engine/training.py in _standardize_user_data(self, x, y, sample_weight, class_weight, check_array_lengths, batch_size)
    577             feed_input_shapes,
    578             check_batch_axis=False,  # Don't enforce the batch size.
--> 579             exception_prefix='input')
    580 
    581         if y is not None:

/usr/local/lib/python3.6/dist-packages/keras/engine/training_utils.py in standardize_input_data(data, names, shapes, check_batch_axis, exception_prefix)
    133                         ': expected ' + names[i] + ' to have ' +
    134                         str(len(shape)) + ' dimensions, but got array '
--> 135                         'with shape ' + str(data_shape))
    136                 if not check_batch_axis:
    137                     data_shape = data_shape[1:]

ValueError: Error when checking input: expected reshape_5_input to have 5 dimensions, but got array with shape (1, 1, 3) #ここのエラーの意味がよく分かっていない
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る