You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Transformer与Keras的神经机器翻译:PositionalEmbedding调用报错

问题分析与解决方案

问题定位

报错Invalid dtype: <property object at 0x7a6808eb53f0>看似触发自Embedding层调用,但实际根源大概率在你自定义的positional_encoding函数实现中——错误信息里的property object表明代码某处把属性对象当成了数值类型使用,导致张量类型校验失败。

具体排查与修复步骤

  1. 检查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)。

  2. 验证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)。

  3. 分步排查call方法
    临时注释掉call方法中的位置编码相加代码:

    # x = x + self.pos_encoding[tf.newaxis, :length, :]
    

    如果此时调用不再报错,即可确认问题出在位置编码张量的生成或类型上。

  4. 放弃无效的输入类型转换
    Keras的Embedding层本身支持int64类型输入,你转换为int32的操作并不能解决问题,无需在输入类型上浪费精力。

内容的提问来源于stack exchange,提问作者user24942539

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 14:25:32