张量和操作
在本文中,我们将讨论张量及其操作。
简介: TensorFlow.js 是一个使用 JavaScript 中的张量定义和运行计算的库。张量是向量和矩阵向更高维度的推广。
张量: TensorFlow.js 中数据的中心单元是tf.Tensor——一组值形成一个或多个维度的数组。 tf.Tensor与多维数组非常相似。
一个tf.Tensor还包含以下属性:
- rank:定义张量包含多少维度。
- shape:定义了数据每个维度的大小。
- dtype:定义张量的数据类型。
注意:我们将使用术语“维度”与排名互换。有时在机器学习中,
张量的“维度”也可以称为特定维度的大小(例如,shape[10, 5] 的矩阵是 rank-2 tensor 或 2-dimensional tensor。第一个维度的维度是 10 . 这可能会造成混淆,但我们将这一注释放在这里是因为您可能会遇到该术语的这些双重用途)。
可以使用tf.Tensor ()方法从数组创建 tf.Tensor。
JavaScript
// Create a rank-2 tensor (matrix) matrix
// tensor from a multidimensional array
const a = tf.tensor([[1,2], [3,4]]);
console.log('shape:', a.shape);
a.print();
// Or you can create a tensor from a
// flat array and specify a shape.
const shape = [2, 2];
const b = tf.tensor([1,2,3,4], shape);
console.log('shape:', b.shape);
b.print();
JavaScript
const a = tf.tensor([[1,2], [3,4]], [2,2], 'int32');
console.log('shape:', a.shape);
console.log('dtype', a.dtype);
a.print();
JavaScript
const a = tf.tensor([[1,2], [3,4]]);
console.log('a shape:', a.shape);
a.print();
const b = a.redshape([4,1]);
console.log('b shape:', b.shape);
b.print();
JavaScript
const a = tf.tensor([[1,2], [3,4]]);
// Returns the multi-dimensional array of values
a.array().then(array => console.log(array));
// Returns the flattened data that backs the tensor
a.data().then(data => console.log(data));
JavaScript
const a = tf.tensor([[1,2],[3,4]]);
// Returns the multi dimensional array of values
console.log(a.arraySync());
// Returns the flattened data that backs the tensor
console.log(a.dataSync());
JavaScript
const x = tf.tensor([1,2,3,4]);
// Equivalent to tf.square(x)
const y = x.square();
y.print();
JavaScript
const a = tf.tensor([1,2,3,4]);
const b = tf.tensor([10,20,30,40]);
// Equivalent to tf.add(a,b)
const y = a.add(b);
y.print();
JavaScript
const a = tf.tensor([[1,2],[3,4]]);
const y = tf.tidy(() => {
const result = a.square().log().neg();
return result;
});
JavaScript
console.log(tf.memory());
输出:
shape: 2,2
Tensor
[[1, 2],
[3, 4]]
shape: 2,2
Tensor
[[1, 2],
[3, 4]]
默认情况下, tf.Tensor将具有float32 dtype 。 tf.Tensor也可以使用 bool、int32、complex64 和 dtypes 创建:
JavaScript
const a = tf.tensor([[1,2], [3,4]], [2,2], 'int32');
console.log('shape:', a.shape);
console.log('dtype', a.dtype);
a.print();
输出:
shape: 2, 2
dtype int32
Tensor
[[1, 2],
[3, 4]]
TensorFlow.js 还提供了一组方便的方法来创建随机张量、填充特定值的张量、来自HTMLImageElement的张量等等。
改变张量的形状: tf.Tensor中的元素数量是其形状大小的乘积。由于通常可以有多个相同大小的形状,因此能够将tf.Tensor重塑为相同大小的另一个形状通常很有用。这可以通过reshape()方法来实现。
JavaScript
const a = tf.tensor([[1,2], [3,4]]);
console.log('a shape:', a.shape);
a.print();
const b = a.redshape([4,1]);
console.log('b shape:', b.shape);
b.print();
输出:
a=array([1, 2, 3, 4])
从张量中获取值:您还可以使用Tensor.array ()或Tensor.data()方法从 tf.Tensor 中获取值:
JavaScript
const a = tf.tensor([[1,2], [3,4]]);
// Returns the multi-dimensional array of values
a.array().then(array => console.log(array));
// Returns the flattened data that backs the tensor
a.data().then(data => console.log(data));
输出:
Tensor
[1, 2, 3, 4]
我们还提供此方法的同步版本,这些版本更易于使用,但会导致您的应用程序出现性能问题。您应该始终更喜欢生产应用程序中的同步方法。
JavaScript
const a = tf.tensor([[1,2],[3,4]]);
// Returns the multi dimensional array of values
console.log(a.arraySync());
// Returns the flattened data that backs the tensor
console.log(a.dataSync());
输出:
a = [1, 2, 3, 4]
操作:虽然张量允许您存储数据,但操作 (ops) 允许您操作该数据。 TensorFlow.js 提供了多种适用于线性代数和机器学习的运算,可以在张量上执行。
示例:计算tf.Tensor 中 al 元素的 x^2:
JavaScript
const x = tf.tensor([1,2,3,4]);
// Equivalent to tf.square(x)
const y = x.square();
y.print();
Output for the above code:
y=x([1, 4, 9, 16 ] )
示例:添加两个tf.Tensor元素的元素:
JavaScript
const a = tf.tensor([1,2,3,4]);
const b = tf.tensor([10,20,30,40]);
// Equivalent to tf.add(a,b)
const y = a.add(b);
y.print();
输出:
numpy = array([ 11, 22, 33, 44 ])
因为张量是不可变的,所以这些操作不会改变它们的值。相反,操作返回总是返回新的tf.Tensor 。
内存:使用 WebGL 后端时,必须显式管理tf.Tensor内存(让tf.tensor超出范围以释放其内存是不够的)。
要销毁 tf.Tensor 的内存,可以使用dispose()方法或tf.dispose() :
在应用程序中将操作链接在一起是很常见的。持有对所有中间变量的引用来处理它们会降低代码的可读性。为了解决这个问题,TensorFlow.js 提供了一个tf.tidy()方法,该方法在函数执行后清理所有没有返回的tf.Tensor ,类似于在执行函数时清理局部变量的方式:
JavaScript
const a = tf.tensor([[1,2],[3,4]]);
const y = tf.tidy(() => {
const result = a.square().log().neg();
return result;
});
输出:
In this example, the result of square() and log() will automatically be disposed of. The result of neg() will not be disclosed as it is the return value of the tf.tidy().
您还可以获取 TensorFlow.js 跟踪的张量数量:
JavaScript
console.log(tf.memory());
输出:
It will display a message on the console while debugging.
e.g
console.log("Hello World");
Now if we run this using -- node helloworld.js
It will print--- Hello World
tf.memory()打印的对象将包含有关当前分配多少内存的信息。