在学习莫烦Python老师的强化学习课程的时候,调试课程的强化学习代码出现的各种错误,基本上是因为环境和软件包的版本兼容性出现的错误,建议各位按照视频对应的版本进行安装并安装正确的依赖,这里做一下记录并存档,供有需要的同学查阅。
莫烦python强化学习课程的地址:
什么是强化学习? (Reinforcement Learning)_哔哩哔哩_bilibili
课程配套github代码的地址:
涉及到因为版本迭代导致的取消或者增加的命令可以上tensorflow的官网去一一比对,直接替换为当前版本中存在的所需要的函数即可
https://tensorflow.google.cn/api_docs/python/tf/all_symbols
整体课程代码调试错误记录
第一种错误:ModuleNotFoundError
基本上都是因为缺失相关的库文件导致的,只要安装即可。
注意:安装之后记得在pycharm的终端里面import一下的库文件,比如,安装了torch,那么就import torch,安装了gym,那么就import gym。后面的问题描述中就不单独说明这一点了。
1.ModuleNotFoundError: No module named 'pandas'
pandas.errors.InvalidIndexError: (0, slice(None, None, None))
问题原因: Python 环境中没有安装 pandas 这个库。
解决办法:因为安装了CUDA和CUDNN,在Annconda环境下就需要采用conda命令安装,pip安装基本都会报错,首先在命令栏中启动环境
conda activate cu118py310
(说明:因为安装的版本不同,所以大家按照自己安装的环境启动环境命令即可)
接下来启动安装
conda install pandas
2.ModuleNotFoundError: No module named 'tensorflow'
问题原因:Python 环境中没有安装 tensorflow 这个库。
解决办法:在命令栏中启动环境,然后启动安装命令,等待安装完成即可
conda install -c conda tensorflow
3.ModuleNotFoundError: No module named 'matplotlib'
问题原因:Python 环境中缺少了名为 matplotlib 的模块
解决办法:使用命令
conda install matplotlib
直接安装即可。
4. PackagesNotFoundError: The following packages are not available from current channels:- gym
问题原因:缺少gym
解决办法:使用命令直接安装即可
conda install -c conda-forge gym
5.ModuleNotFoundError: No module named 'pyglet'
问题原因:缺少相应安装包
解决办法:安装即可
conda install-c conda-forge pylet
第二种错误:AttributeError
大都是因为版本更新导致的具体调用命令的调整,存在兼容性问题,解决办法是在导入Tensorflow时代码修改为
import tensorflow.compat.v1 as tf
或者换装1.x版本的Tensorflow。这里记录了1.x和2.x版本中具体命令存在的兼容性问题,如果以上方法不管用,或者你不怕麻烦,那么就参考以下报错逐一修改。
1.AttributeError: 'DataFrame' object has no attribute 'ix'
问题原因:在较新版本的 pandas 中(特别是从 pandas 0.24.0 版本开始),.ix 索引器已经被废弃并从库中移除了。.ix 索引器是 pandas 早期版本中用于基于标签和整数位置的混合索引的,但它经常导致混淆和错误,因此被 .loc 和 .iloc 替代。
.loc 用于基于标签的索引。
.iloc 用于基于整数位置的索引。
解决办法:
如果原代码为:
result = df.ix[0:5, 'column_name']
则可修改为:
result = df.iloc[0:5, df.columns.get_loc('column_name')]
2.AttributeError: module 'tensorflow' has no attribute 'append'
问题原因:在使用python的pandas库处理数据的时后,对DataFrame进行添加行操作,而在比较新的panda库版本中,append命令更新了
解决办法:
a.将append改为_append
dataframe = dataframe._append()
b.使用“pandas.concat()”方法代替“dataframe.append()
dataframe = pandas.concat()
3.AttributeError: module 'tensorflow' has no attribute 'set_random_seed'
问题原因:在 TensorFlow 的较新版本中,tensorflow.set_random_seed() 函数已经不再直接可用
解决办法:
tf.set_random_seed(args.seed)#tf<2.0
tf.random.set_seed(args.seed)#tf>2.0
4.AttributeError: module 'tensorflow' has no attribute 'placeholder'
问题原因:tf.placeholder是tensorflow1.x版本的使用的函数,在TensorFlow2.x中,tf.placeholder 已经被完全移除,因为它不再与 TensorFlow2.x的Eager Execution 模式兼容。
解决办法:
Import tensorflow as tf
将原代码:
x = tf.placeholder(shape=[None, 2], dtype=tf.float32)
修改为
x = tf.compat.v1.placeholder(shape=[None, 2], dtype=tf.float32)
5.AttributeError: module 'tensorflow' has no attribute 'variable_scope'
问题原因:TensorFlow 2.x的版本的命令与1.x版本存在兼容性问题。
解决办法:使用compat接口修改命令
原代码:tf.variable_scope
修改后代码:tf.compat.v1.variable_scope
6.AttributeError: module 'tensorflow' has no attribute 'GraphKeys'
问题原因:同样地,是2.x和1.x中命令的兼容性问题
解决办法:使用compat接口修改命令
原代码:tf.GraphDef()
修改后代码:tf.compat.v1.GraphDef()
7.AttributeError: module 'tensorflow' has no attribute 'get_variable'
问题原因:同样地,是2.x和1.x中命令的兼容性问题
解决办法:使用compat接口修改命令
原代码:tf.get_variable
修改后代码:tf.compat.v1.get_variable
8.AttributeError: module 'tensorflow' has no attribute 'squared_difference'
问题原因:同样地,是2.x和1.x中命令的兼容性问题
解决办法:使用compat接口修改命令
原代码:tf.squared_difference
修改后代码:tf.compat.v1.squared_difference
9. AttributeError:module'tensorflow._api.v2.train'has no attribute 'RMSPropOptimizer'
问题原因:同上
解决办法:同上
10. AttributeError: module 'tensorflow' has no attribute 'get_collection'
问题原因:同上
解决办法:同上
11. AttributeError: module 'tensorflow' has no attribute 'assign'
问题原因:同上
解决办法:同上
12. AttributeError: module 'tensorflow' has no attribute 'Session'.
问题原因:同上
解决办法:同上
13. AttributeError: module 'tensorflow' has no attribute 'global_variables_initializer'
问题原因:同上
解决办法:同上
14. AttributeError: module 'tensorflow' has no attribute 'GraphKeys'
问题原因:同上
解决办法:同上
15. AttributeError: module 'tensorflow' has no attribute 'squared_difference'
问题原因:同上
解决办法:同上
16. AttributeError: 'PendulumEnv' object has no attribute 'seed'
问题原因:gym高版本中的Env.seed()被移除了, Pendulum-v1不直接提供seed方法来设置随机数生成器的种子
解决办法:
a.使用高版本的替代方法,env.reset(seed=seed)代替env.seed(seed)
如:
使用env.reset(seed=1)代替env.seed(1)
b.卸载当前版本的gym,安装更低版本的gym
conda uninstall gym
conda install -c conda-forge gym==0.25.2
17.AttributeError: module 'tensorflow' has no attribute 'layers'
问题原因:在 TensorFlow 2.x 中,tf.layers
已经被弃用并移除了
解决办法:使用 tf.layers
的代码替换为 tf.keras.layers
原来的代码:
net = tf.layers.dense()
修改后的代码:
net = tf.keras.layers.Dense()
第三种错误:RuntimeError
一般是因为命令与命令之间存在冲突的情况
RuntimeError: tf.placeholder() is not compatible with eager execution.
问题原因:在 TensorFlow 2.x的版本中,tf.placeholder() 确实不再与 Eager Execution 兼容,因为 TensorFlow 2.x 默认启用了 Eager Execution
解决办法:
在原代码包含tf.compat.v1.placeholder的语句之前添加
tf.compat.v1.disable_eager_execution()
示例:
tf.compat.v1.disable_eager_execution()
self.s = tf.compat.v1.placeholder(tf.float32, [None, self.n_features], name='s')
第四种错误:DependencyNotInstalled
一般是安装的库或者组件的相关依赖没有安装
1.Gym error DependencyNotInstalled: pygame is not installed, run pip install gym[classic_control]`
问题原因:缺少图形界面支持: 环境没有安装必要的图形界面库pygame
解决办法:在命令行中输入命令安装即可
conda install -c conda-forge pygame
2.gym.error.DeprecatedEnv: Environment version v0 for `Pendulum` is deprecated. Please use `Pendulum-v1` instead.
问题原因:Pendulum-v0 环境版本已经被弃用,并建议你使用 Pendulum-v1
解决办法:
原句:
env = gym.make('Pendulum-v0')
修改版本:
env = gym.make('Pendulum-v1')
第五种错误:TypeError
一般是对数组或矩阵的索引或者数据类型转换存在问题时出现
TypeError: tuple indices must be integers or slices, not tuple
问题原因:在python中,元组不支持多维索引
解决办法: 在observation前面加上一句接收和转换的语句,如
原句:
observation = np.array(observation)
修改之后:
observation = np.array(observation)
observation = observation[np.newaxis, :]
第六种错误:ValueError
ValueError: setting an array element with a sequence.
待更新
第七种错误:ImportError
ImportError: Library "GLU" not found
问题原因:Python环境或系统中缺少OpenGL Utility Library (GLU) 的支持
解决办法:
sudo apt-get update
sudo apt-get install python3-opengl
注意:如果是python3版本的,就需要在命令中加入,不然会报找不到安装包的错误。