基于Transformer与Keras的神经机器翻译:PositionalEmbedding调用报错
问题分析与解决方案
问题定位
报错Invalid dtype: <property object at 0x7a6808eb53f0>看似触发自Embedding层调用,但实际根源大概率在你自定义的positional_encoding函数实现中——错误信息里的property object表明代码某处把属性对象当成了数值类型使用,导致张量类型校验失败。
具体排查与修复步骤
检查
positional_encoding函数实现
确保函数正确接收length和depth参数,没有错误引用类属性(比如误写self.depth而非传入的depth参数)。参照官方逻辑的标准实现示例:def positional_encoding(length, depth): depth = depth / 2 positions = np.arange(length)[:, np.newaxis] depths = np.arange(depth)[np.newaxis, :] / depth angle_rates = 1 / (10000 ** depths) angle_rads = positions * angle_rates pos_encoding = np.concatenate([np.sin(angle_rads), np.cos(angle_rads)], axis=-1) return tf.cast(pos_encoding, dtype=tf.float32)重点确认:函数内所有用到的
depth都是传入的参数,而非某个类的属性;返回的张量是合法的数值类型(如float32)。验证
pos_encoding的合法性
在PositionalEmbedding类的__init__方法末尾添加打印语句,检查生成的位置编码张量:print("pos_encoding dtype:", self.pos_encoding.dtype) print("pos_encoding shape:", self.pos_encoding.shape)正常输出应为
float32类型,形状为(2048, 512)(对应你设置的length=2048、d_model=512)。分步排查call方法
临时注释掉call方法中的位置编码相加代码:# x = x + self.pos_encoding[tf.newaxis, :length, :]如果此时调用不再报错,即可确认问题出在位置编码张量的生成或类型上。
放弃无效的输入类型转换
Keras的Embedding层本身支持int64类型输入,你转换为int32的操作并不能解决问题,无需在输入类型上浪费精力。
内容的提问来源于stack exchange,提问作者user24942539
相关产品推荐
相关产品推荐

