我有一个复杂的keras模型,其中一个层是一个自定义的预训练层,它需要“int32”作为输入。这个模型是作为一个继承自Model的类实现的,它是这样实现的:
class MyModel(tf.keras.models.Model):
def __init__(self, size, input_shape):
super(MyModel, self).__init__()
self.layer = My_Layer()
self.build(input_shape)
def call(self, inputs):
return self.layer(inputs)
但是当它到达self.build
方法时,它抛出下一个错误:
ValueError: You cannot build your model by calling `build` if your layers do not support float type inputs. Instead, in order to instantiate and build your model, `call` your model on real tensor data (of the correct dtype).
我该怎么修呢?
2条答案
按热度按时间7cjasjjr1#
使用model.build生成模型时会引发异常。
model.build 函数根据给定的输入形状构建模型。
引发错误的原因是,当我们尝试构建模型时,它首先调用一个带有x参数的模型,该参数取决于以下代码中的输入形状类型
x在这里是TensorFlow占位符。因此,当尝试使用x作为输入调用模型时,它将弹出TypeError,并且结果(block除外)将正常工作并给予错误。
假设输入形状为16x16,而不是使用
self.build([(16,16)])
,调用基于真实的Tensor的模型rqenqsqc2#
变通方案
我在尝试将带有多个整型输入Tensor的模型导出为
SavedModel
时遇到了同样的问题。我通过覆盖build
方法并手动指定self._build_input_shape
来解决这个问题。在原始代码中发生了什么
tf.keras.Model
对象的默认build
方法默认将输入Tensor视为浮点Tensor,最终抛出异常。tf.keras.Model
的此类行为在此处定义,其中模型的输入由base_layer_utils.generate_placeholders_from_shape
创建,它将dtype
指定为float
。变通方案会发生什么情况
由于
tf.keras.Model.build
最终会调用其超类的构建函数tf.keras.layer.Layer.build
,因此解决方法跳过了导致问题的tf.keras.Model.build
逻辑,但如果您依赖于tf.keras.Model.build
中定义的其他逻辑,则可能必须在此之后添加补充代码