如何在 keras 层的调用方法中保存 numpy 数组



我使用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_step修饰tf.function,np.save都表示无法将符号张量转换为numpy数组。如果我在不使用tf.function的情况下更改为np.save('outputs.txt', outputs.numpy()),则表明张量对象没有属性numpy。此外,当不使用tf.function时,call()函数似乎被调用了两次,第一次调用符号张量,第二次调用渴望张量

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

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

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

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

最新更新