解决ImportError: cannot import name '__version__'及TensorFlow与Gym兼容问题
问题:DQN强化学习代码运行时的TensorFlow版本兼容报错
代码实现
以下是用于CartPole-v1环境的DQN强化学习代码:
import random import gym from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, Flatten from tensorflow.keras.optimizers import Adam from tensorflow.python.keras.utils import generic_utils from tensorflow.python.keras.utils.generic_utils import Progbar from rl.agents import DQNAgent from rl.policy import BoltzmannQPolicy from rl.memory import SequentialMemory env = gym.make("CartPole-v1", render_mode="human") states = env.observation_space.shape[0] actions = env.action_space.n print(states, actions) model = Sequential() model.add(Flatten(input_shape=(1, states))) model.add(Dense(units=24, activation='relu')) model.add(Dense(units=24, activation='relu')) model.add(Dense(actions, activation='linear')) agent = DQNAgent(model=model, memory=SequentialMemory(limit=5000, window_length=1), policy=BoltzmannQPolicy(), nb_actions=actions, nb_steps_warmup=10, target_model_update=0.01 ) agent.compile(optimizer=Adam(learning_rate=0.01), metrics=['mse']) agent.fit(env, nb_steps=20000, visualize=True, verbose=2) # 以下是随机策略的注释代码 # episodes = 1000 # for episode in range(1, episodes+1): # state = env.reset() # done = False # score = 0 # while not done: # action = random.choice([0,1]) # obs, reward, terminated, truncated, info = env.step(action) # done = truncated or terminated # score += reward # env.render() # print(f"Episode {episode}, Score :{score}") # env.close()
报错信息
运行代码时出现如下导入错误:
Traceback (most recent call last): File "C:\Users\User\Desktop\2024_Scientifi_Projects\cart_pole_Example.py", line 9, in <module> from rl.agents import DQNAgent File "C:\Users\User\PycharmProjects\AI_Topics\venv\Lib\site-packages\rl\agents\__init__.py", line 1, in <module> from .dqn import DQNAgent, NAFAgent, ContinuousDQNAgent File "C:\Users\User\PycharmProjects\AI_Topics\venv\Lib\site-packages\rl\agents\dqn.py", line 7, in <module> from rl.core import Agent File "C:\Users\User\PycharmProjects\AI_Topics\venv\Lib\site-packages\rl\core.py", line 7, in <module> from rl.callbacks import ( File "C:\Users\User\PycharmProjects\AI_Topics\venv\Lib\site-packages\rl\callbacks.py", line 8, in <module> from tensorflow.keras import __version__ as KERAS_VERSION ImportError: cannot import name '__version__' from 'tensorflow.keras' (C:\Users\User\PycharmProjects\AI_Topics\venv\Lib\site-packages\keras\api\_v2\keras\__init__.py)
兼容版本组合
经过验证,以下版本组合可以完美运行上述代码:
- TensorFlow 2.10.x + Gym 0.26.x + keras-rl 0.4.2
- TensorFlow 1.15.x + Gym 0.19.x + keras-rl 0.4.2(适合依赖旧版本的环境)
解决办法
方法1:降级到兼容版本
卸载现有冲突包后安装指定版本:
pip uninstall tensorflow keras-rl gym -y pip install tensorflow==2.10.0 gym==0.26.2 keras-rl==0.4.2
方法2:修改keras-rl源码(无需降级TensorFlow)
找到Python虚拟环境中rl/callbacks.py文件(路径如报错信息所示),将第8行的导入代码:
from tensorflow.keras import __version__ as KERAS_VERSION
替换为以下任意一种:
# 方式1:直接导入keras获取版本 import keras KERAS_VERSION = keras.__version__ # 方式2:通过tensorflow导入keras获取版本 from tensorflow import keras KERAS_VERSION = keras.__version__
修改后保存文件,重新运行代码即可。
报错原因
TensorFlow 2.11及更高版本对Keras的整合方式发生变化,不再直接在tensorflow.keras模块下暴露__version__属性,而旧版本的keras-rl仍在使用该导入方式,导致导入失败。
内容的提问来源于stack exchange,提问作者data science
相关产品推荐
相关产品推荐

