TypeError:在使用tf.map\u fn和keras功能模型时,无法为<Kerastenor构建TypeSpec

2024-04-18 20:08:53 发布

您现在位置:Python中文网/ 问答频道 /正文

当我试图在keras功能模型的定义中使用tf.map_fn时,我得到了错误:

TypeError: Could not build a TypeSpec for <KerasTensor: ...

例如,该简单模型将在tf nightly 2.5.0中触发该错误:

import tensorflow as tf

from tensorflow.keras.layers import Input
from tensorflow.keras.models import Model

x = Input(shape=(10,))

y = tf.map_fn(lambda x : x * 2, x, fn_output_signature=tf.float32)

model = Model(inputs=x, outputs=y)

然而,将对tf.map_fn的调用替换为对其他tensorflow操作的调用效果良好


Tags: from模型import功能mapinputmodel定义
2条回答

为什么不改用tf.keras.layers.Lambda层呢

import tensorflow as tf

from tensorflow.keras.layers import Input
from tensorflow.keras.models import Model

x = Input(shape=(10,))

y = tf.keras.layers.Lambda(lambda x : x * 2)(x)

model = Model(inputs=x, outputs=y)

这似乎是由于tf.map_fn无法确定输入张量的类型规范(当输入为keras辛同态输入时)

现在我已经有好几次遇到tensorflow ops和Keras符号输入张量的问题。在自定义层中包装有问题的代码似乎可以解决问题

例如,将上面的代码替换为该代码将成功执行:

import tensorflow as tf

from tensorflow.keras.layers import Input, Layer
from tensorflow.keras.models import Model

x = Input(shape=(10,))

class MapLayer(Layer):

    def call(self, input):
        return tf.map_fn(lambda x : x * 2, input, fn_output_signature=tf.float32)

y = MapLayer()(x)

model = Model(inputs=x, outputs=y)

相关问题 更多 >