从 swift 数组创建张量

Creating tensor from a swift array

这很好用:

import TensorFlow
var t = Tensor<Float>([[1, 0], [0, 1]])

但是下面给出了错误

import TensorFlow
var a = [[1, 0], [0, 1]]
var t = Tensor<Float>(a)
error: expression type 'Tensor<Float>' is ambiguous without more context
var t = Tensor<Float>(a)
        ^~~~~~~~~~~~~~~~

为什么会这样?还有如何从 swift 中的数组创建张量。

您的第一个代码之所以有效,是因为它使用 文字 ,而不是使用已声明的变量(其类型已确定)来初始化 Tensor<Float>。编译器对文字进行特殊处理。

您调用的 Tensor.init 的重载是 this。在您的情况下,它接受 ShapedArray<Float>.

ShapedArray 符合协议 ExpressibleByArrayLiteral,这意味着编译器可以将数组文字隐式转换为 ShapeArray。但是,这仅限于文字,例如[[1, 0], [0, 1]],而不是引用数组类型变量的标识符,例如aa 的类型被编译器推断为 [[Int]],编译器无法将 [[Int]] 隐式转换为 ShapedArray<Float>

虽然不那么重要,但 Float 符合 ExpressibleByIntegerLiteral 的事实(因此 10 可以转换为浮点数)也有助于允许你要编译的代码。

之所以var aa: Tensor<Float> = [[1.0, 0.0], [1.0, 0.0]]有效是因为Tensor也符合ExpressibleByArrayLiteral.