Keras中如何将Average层输出转换后传入要求int32输入的Conv2D层
问题解决方案
核心原因排查
你遇到的报错不是Conv2D要求int32类型输入(正常Conv2D层本身就要求浮点型输入),报错触发点来自参数类型不匹配,按以下优先级排查解决:
最高概率修复方案:移除冗余的input_shape参数
Keras函数式API的层会在接收输入张量时自动推导输入形状,不需要手动传入input_shape参数,这是Sequential模型的用法。你当前传入的self._layer_hs_o.shape是张量的动态形状对象,其中未知维度会被识别为非整数类型,直接触发类型报错。
修改代码如下:
self._layer_hs_o = Average(name="heads")( [self._layer_hs_s, self._layer_hs_m, self._layer_hs_l]) # 移除input_shape参数即可 self._layer_d2c_c = Conv2D(d2c_config["filters"], d2c_config["kernels"][0], padding="same", activation=d2c_config["activation"], name="d2c_c", kernel_initializer=d2c_config["init"], dilation_rate=d2c_config["dilations"][0] )(self._layer_hs_o)
次优先级排查方案:统一张量数据类型
如果移除input_shape后仍报错,检查三个输入到Average层的张量是否存在类型不一致的问题,可手动强制转换Average层输出为float32类型:
from tensorflow.keras.layers import Lambda import tensorflow as tf self._layer_hs_o = Average(name="heads")([self._layer_hs_s, self._layer_hs_m, self._layer_hs_l]) # 强制转换类型 self._layer_hs_o = Lambda(lambda x: tf.cast(x, tf.float32), name="cast_float")(self._layer_hs_o)
兜底排查点
确认三个输入到Average层的张量形状完全一致,形状不匹配会导致Average层输出动态形状,也可能间接触发类型报错。
内容的提问来源于stack exchange,提问作者haddagart
相关产品推荐
相关产品推荐

