keras 如何在TF-Agents框架中提取DQN Agent的权重?

kx7yvsdv  于 2023-10-19  发布在  其他
关注(0)|答案(1)|浏览(142)

我正在使用TF-Agents解决自定义强化学习问题,在那里我在自定义环境中的一些特征上训练DQN(使用TF-Agents框架中的DqnAgents构建),并单独使用keras卷积模型从图像中提取这些特征。现在,我想将这两个模型合并组合成一个模型,并使用迁移学习,在这里我想初始化网络的第一部分(图像到特征)以及第二部分(在前面的情况下是DQN层)的权重。
我尝试使用keras.layers构建这个组合模型,并使用Tf-Agents tf.networks.sequential类编译它,以便在将其传递给DqnAgent()类时将其转换为所需的形式。(我们称之为(a))。
我能够用权重初始化图像特征提取器网络的层,因为我将其保存为.h5文件,并且能够获得相同的numpy数组。所以我可以为这部分做迁移学习。
问题出在DQN层,我使用规定的Tensorflow保存模型格式(pb)保存了上一个示例中的策略,该格式为我提供了一个包含模型属性的文件夹。然而,我无法以这种方式查看/提取我的DQN的权重,并且推荐的tf.saved_model.load('policy_directory')对于我可以看到的关于策略的数据并不真正透明。如果我必须像在语句(a)中那样遵循迁移学习,我需要提取我的DQN的权重并将它们分配给新网络。对于这种需要应用迁移学习的情况,文档似乎相当稀疏。
有人能帮我解释一下如何从Saved Model方法(从pb文件)中提取权重吗?或者有更好的方法来解决这个问题吗?

hjqgdpho

hjqgdpho1#

我想补充另一个解决方案,因为我发现自己处于类似的情况:
我想为Atari Breakout以标准DQN方式训练DQN Agent,但是,我想在训练期间定期监控体重。我使用DqnAgent()类,并为“q_network”参数给予一个QNetwork()示例。
实现这一点的一种方法,就像你Tarun Sriram说的那样,直接修改DqnAgent()类的源代码,即'dqn_agent.py'文件,通过添加这样的方法:

def get_q_network_weights(self):
    # get weights and biases as numpy arrays
    weights = self._q_network.trainable_weights[-2].numpy()
    biases  = self._q_network.trainable_weights[-1].numpy()
    # get weights and biases as tensorflow tensors
    weights = tf.identity(self._q_network.trainable_weights[-2])
    biases = tf.identity(self._q_network.trainable_weights[-1])
    return weights, biases

请注意,你必须使用tf.identity()来创建一个深度副本,否则只会返回对原始Tensor的引用,因此它会在训练过程中发生变化(这意味着如果我在训练过程中碰巧将权重存储在一个列表中,那么最终所有的值都会相同,因为它们指向同一个原始Tensor)。
但是,有一种侵入性较低的方法:您可以直接访问传递给DQN Agent构造函数的Q-Network的权重(和偏置)。在我的例子中,我传递的Q网络被简单地称为“q_net”:

agent = DqnAgent(..., q_network=q_net, ...)

现在,在培训期间,您可以简单地使用:用途:

q_net.trainable_weights

或(对于特定层重量):

q_net.get_layer("name_of_layer").get_weights()

请注意,在这里,您应该直接将返回的Tensor转换为numpy数组,或者使用tf.identity()创建一个深度副本,以避免同一引用的多个副本。

相关问题