如何在keras层中保存numpy数组';s调用方法
我使用tensorflow 2.1和自定义层,如下所示:如何在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
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就足够了。