这是再现问题的最小示例:
from keras.models import Sequential
from keras.layers import Dense, Flatten, LeakyReLU
from keras.regularizers import l1
from rl.agents.dqn import DQNAgent
reg = l1(1e-5)
relu_alpha = 0.01
model = Sequential()
model.add(Flatten(input_shape=[128,10,20]))
model.add(Dense(16, kernel_regularizer = reg))
model.add(LeakyReLU(alpha = relu_alpha))
model.add(Dense(3, activation = "linear", kernel_regularizer = reg))
model.compile(loss='mse', jit_compile=True)
结果是以下错误:
File "C:\Users\lbosc\anaconda3\envs\ml_env3\lib\site-packages\keras\engine\training_v1.py", line 306, in compile
raise TypeError(
TypeError: Invalid keyword argument(s) in `compile`: {'jit_compile'}
我能够理解问题出在import DQNAgent
行,它用自己的方法重新定义了Sequential
的compile
方法。事实上,如果删除import
,编译就可以正确完成。keras.models.Sequential
的compile方法定义在库的文件training.py
中,接受参数jit_compile
,而rl.agents.dqn.DQNAgent
在最后使用的compile
方法调用training_v1.py
文件中定义的keras的compile
方法,有点不同,不接受参数jit_compile
。
因此,由于在代码的后续部分中,我需要DQNAgent
,最后的问题是:如何强制keras-rl 2使用training.py
而不是training_v1.py
?或者,在另一种选择中,我如何告诉我的代码使用哪个是compile
方法?
1条答案
按热度按时间chy5wohz1#
我发布了我最终找到的解决方案,即使我并不完全理解它的工作原理。
rl.agents
中的__init__
文件导入rl.agents.ddpg
;在这里,您应该替换以下调用:其中:
这就是你keras-r1开始使用tensorflow的v2函数而不是v1兼容函数,并且与v2兼容的我的代码的其余部分不再发现冲突。