# 起きているエラー
Traceback (most recent call last): File "train.py", line 44, in <module> dqn = DQNAgent(model=model, nb_actions=nb_actions, memory=memory, nb_steps_warmup=100, target_model_update=1e-2, policy=policy) File "/usr/local/lib/python3.8/dist-packages/rl/agents/dqn.py", line 108, in __init__ if hasattr(model.output, '__len__') and len(model.output) > 1: File "/usr/local/lib/python3.8/dist-packages/tensorflow/python/framework/ops.py", line 851, in __len__ raise TypeError("len is not well defined for symbolic Tensors. ({}) " TypeError: len is not well defined for symbolic Tensors. (dense_2/BiasAdd:0) Please call `x.shape` rather than `len(x)` for shape information.
この問題について調べたところ、このページでTensorFlowが1系であることが原因とされましたが、自分の環境のTensorFlowはもともと2系で、他にどの様な問題があるのかわかりません。
該当のソースコード
以下のコードでなくても、keras-rlのサンプルコードでも全く同じエラーが起きます
エラー箇所にはコメントがあります。
Python3
1from tensorflow.keras.models import Sequential, model_from_json 2from tensorflow.keras.layers import Dense, Activation, Flatten, Conv2D, MaxPooling2D 3from tensorflow.keras.optimizers import Adam 4 5from rl.agents.dqn import DQNAgent 6from rl.policy import EpsGreedyQPolicy 7from rl.memory import SequentialMemory 8 9from MyEnv import WalkingMap 10 11import matplotlib.pyplot as plt 12 13import pygame 14from pygame.locals import * 15import sys 16import numpy as np 17import time 18import datetime 19 20env = WalkingMap(True) 21nb_actions = env.action_space.n 22 23# DQNのネットワーク定義 24RELEARN = False 25if RELEARN: # already finished 100000 step 26 json_string = open('results/test1.json').read() 27 model = model_from_json(json_string) 28 model.load_weights('results/test1.h5f5') 29else: 30 model = Sequential() 31 model.add(Conv2D(filters=32, kernel_size=(3, 3), activation='relu', input_shape=(1,) + env.observation_space.shape)) 32 model.add(MaxPooling2D(pool_size=(2,2))) 33 model.add(Flatten()) 34 model.add(Dense(units=64, activation='relu')) 35 model.add(Dense(units=64, activation='relu')) 36 model.add(Dense(units=nb_actions, activation='linear')) 37print(model.summary()) 38 39 40# experience replay用のmemory 41memory = SequentialMemory(limit=50000, window_length=1) 42# 行動方策はオーソドックスなepsilon-greedy。ほかに、各行動のQ値によって確率を決定するBoltzmannQPolicyが利用可能 43policy = EpsGreedyQPolicy(eps=0.2) 44 45#エラー箇所↓ 46dqn = DQNAgent(model=model, nb_actions=nb_actions, memory=memory, nb_steps_warmup=100, target_model_update=1e-2, policy=policy) 47dqn.compile(Adam(lr=1e-3), metrics=['mae']) 48 49history = dqn.fit(env, nb_steps=20000, visualize=True, verbose=1, nb_max_episode_steps=25) 50#学習の様子を描画したいときは、Envに_render()を実装して、visualize=True にします, 51 52num_ave=50 53hist_ave=[] 54hist_stack=0 55for i, v in enumerate(history.history["nb_episode_steps"]): 56 hist_stack += v 57 if i >= num_ave-1: 58 hist_ave.append(hist_stack / num_ave) 59 hist_stack -= history.history["nb_episode_steps"][i - num_ave+1] 60 else: 61 hist_ave.append(hist_stack / (i+1)) 62 63plt.subplot(2,1,1) 64plt.plot(history.history["nb_episode_steps"]) 65plt.plot(hist_ave) 66plt.ylabel("step") 67 68 69hist_ave=[] 70hist_stack=0 71for i, v in enumerate(history.history["episode_reward"]): 72 hist_stack += v 73 if i >= num_ave-1: 74 hist_ave.append(hist_stack / num_ave) 75 hist_stack -= history.history["episode_reward"][i - num_ave+1] 76 else: 77 hist_ave.append(hist_stack / (i+1)) 78plt.subplot(2,1,2) 79plt.plot(history.history["episode_reward"]) 80plt.plot(hist_ave) 81plt.xlabel("episode") 82plt.ylabel("reward") 83 84plt.grid() 85plt.show() 86 87json_string=dqn.model.to_json() 88open('test.json', 'w').write(json_string) 89 90# After training is done, we save the final weights. 91dqn.save_weights('test.h5f5', overwrite=True)
バージョン情報
モジュール | バージョン |
---|---|
Python | 3.8.2 |
TensorFlow | 2.3.0 |
Keras-RL | 0.4.2 |
OpenAI Gym | 0.17.2 |
Keras(ソースコード中では不使用) | 2.4.3 |
kerasのみでの機械学習ではエラーはありませんでした。もしあるとすればkeras-rlかtensorflowだと思うのですが...
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。