限制

ChainerX存在一些不明显的限制:

  • ChainerX仅支持有限的一组数据类型:布尔_ 整数8 整数16 整数32 整数64 单位8 浮动32 浮点64.

  • 不支持混合数据类型的操作。您需要使用以下两种方法显式转换数据类型链接器x.ast类型()F.铸造().

  • 目前还不支持真正的Python除法,其中2/3返回0.66而不是0。给一个标准数据类型的整数32, / 不返回数组浮点64,但返回一个数组整数32.

  • 只有有限的链条功能通过ChainerX集成对进行了良好的测试。

  • ChainerX CUDA后端需要cuDNN。请参见安装了解详细信息。

  • 作为ChainerX阵列s有自己的计算图,出于安全考虑,禁止进行某些操作:

    • 除非数组没有计算图形,否则禁止对其数据进行就地修改。

       = 链子.0((2,), 链子.浮动32)
      .要求_等级()  #在“a”上安装计算图形。
      
       += 1  # ! 错误
      

      这种限制的原因是,由于向后操作可能取决于,如果改变后向渐变,可能会意外地受到影响。

      您可以通过创建断开连接的视图来绕过此限制:

      #与计算图形“A”断开连接的“A”的内存共享视图。
      b = .作为坡度停止()
      
      b += 1
      

      然而,请注意,此操作本身就是危险的。您应该格外小心,以确保这不会影响反向计算。

      还要注意,我们可能会在将来进一步限制,以便仅在实际安全的情况下才允许对断开的视图进行就地修改。

    • 如果数组用变量具有requires_grad=真(默认设置),您将无法重新分配阵列:

       = 链子.0((2,), 链子.浮动32)
      b = 链子.0((2,), 链子.浮动32)
      无功功率,无功功率 = 链子.变量()
      
      无功功率,无功功率.阵列 = b  # ! 错误
      

      您可以通过在可变阵列:

      无功功率,无功功率.阵列[:] = b
      

      这种变通方法也可能像前面的限制一样危险。