我使用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()
方法
但请记住,这样做可能会显著增加训练和推理时间。