当使用lambda层与用户定义的KERAS中的lambda层的克隆模型无法找到功能



我想在模型中调整gumbel-softmax。我发现作者启动了张力。我将其带入了我的源代码,并将其在lambda层中使用,以取代现有的SoftMax activation层。它起作用了,但是问题发生在此模型克隆其他模型时发生错误。有任何解决方案或经验可以解决这个问题吗?

感谢您的阅读。

Traceback (most recent call last):
  File "D:/dev/workspace/starcraftrlchallenge/python/saida_agent_example/zealotVsZealot/zealot_vs_zealot_v0_Proposed_discreted_gumbel_mb.py", line 269, in <module>
    agent.compile([Adam(lr=5e-5), Adam(lr=5e-5)], metrics=['mae'])
  File "D:devworkspacestarcraftrlchallengepythoncorealgorithmMAProposed.py", line 321, in compile
    self.actor_train_on_batch = self.actor_optimizer()
  File "D:devworkspacestarcraftrlchallengepythoncorealgorithmMAProposed.py", line 163, in actor_optimizer
    self.target_actor = keras.models.clone_model(self.actor)
  File "C:UsersSDS-1Anaconda3libsite-packageskerasmodels.py", line 251, in clone_model
    return _clone_functional_model(model, input_tensors=input_tensors)
  File "C:UsersSDS-1Anaconda3libsite-packageskerasmodels.py", line 139, in _clone_functional_model
    layer(computed_tensor, **kwargs))
  File "C:UsersSDS-1Anaconda3libsite-packageskerasenginebase_layer.py", line 457, in __call__
    output = self.call(inputs, **kwargs)
  File "C:UsersSDS-1Anaconda3libsite-packageskeraslayerscore.py", line 687, in call
    return self.function(inputs, **arguments)
  File "D:devworkspacestarcraftrlchallengepythonsaida_agent_examplezealotVsZealotmodelac_networks_gumbel_mb.py", line 22, in <lambda>
    action_logit = Lambda(lambda h : gumbel_softmax(h, hard=True))(h)
NameError: name 'gumbel_softmax' is not defined

看一下clone_model源代码,它似乎使用了在模型加载中使用的from_config方法。在那里(加载模型时(对自定义对象进行特殊护理。如Keras常见问题解答:

如果要加载的模型包括自定义图层或其他自定义类或功能,则可以通过custom_objects参数传递到加载机制。

虽然clone_model没有这样的论点。一个简单的解决方法是保存和加载模型以克隆它:

from keras.models import load_model
def gumbel_softmax:
    ....
model.save('tmp.h5')
clone = load_model('tmp.h5', custom_objects={'gumbel_softmax': gumbel_softmax})
os.remove('tmp.h5')

最新更新