如何在keras层中保存numpy数组';s调用方法

如何在keras层中保存numpy数组';s调用方法,numpy,tensorflow,keras,Numpy,Tensorflow,Keras,我使用tensorflow 2.1和自定义层,如下所示: class Mylayer(KL.layer): def __init__(self, name): super(Mylayer, self).__init__(name) self.conv = KL.Conv2D(32) def call(self, inputs): outputs = self.conv(inputs) np.save('output

我使用tensorflow 2.1和自定义层,如下所示:

class Mylayer(KL.layer):
    def __init__(self, name):
        super(Mylayer, self).__init__(name)
        self.conv = KL.Conv2D(32)

    def call(self, inputs):
        outputs = self.conv(inputs)
        np.save('outputs.npy', outputs)
        return outputs
然而,无论我是否在train_步骤修饰tf.function,
np.save
表示无法将符号张量转换为numpy数组。如果我在不使用tf.function的情况下更改为
np.save('outputs.txt',outputs.numpy())
,则表明tensor对象没有属性numpy。另外,当不使用tf.function时,
call()
函数似乎会被调用两次,第一次使用符号张量,第二次使用渴望张量


如何在call()中保存张量值?

Keras模型隐式编译为静态图,无论您是否在call方法中使用
@tf.function
。因此,所有的张量都是
tf.Tensor
类型,而不是
tf.Tensor
类型,因此没有
numpy()
方法

要克服这个问题,只需将
dynamic=True
传递给使用该层的模型的构造函数。然后,您将能够使用
numpy()
方法


但请记住,这样做可能会显著增加训练和推理时间。

为什么不保存输出,而不是从调用方法内部保存?因为我使用pytorch版本的预训练权重,我想逐层验证所有输出我不明白这会如何改变任何东西。您有一个MyLayer,当您创建使用它的模型时,获取它的输出,并将其作为输出添加到模型中。MyLayer只是一个示例。我实现的实际层是OctConv()。我的模型由一系列OCTCONV组成。因此,收集所有的高/低频输出会使模型的输出非常大。在实践中,实际的方法调用不会得到太多调用。它只是帮助创建图表。如果不能一次处理这么多输出,则可以将模型分离为多个模型,并链接输出。听起来很痛苦,我很想知道你对这个问题是否有一个好的答案。您还可以研究tensorboard是如何处理这个问题的,因为它可以让您监视张量。我只在层的构造函数中找到
动态的
,并将
作为模型的属性热切地运行。我应该为每个层设置
dynamic=True
,还是为整个模型设置
run\u
就足够了?
run\u就足够了。