跳到主要内容

Tensor

2025年02月10日
柏拉文
越努力,越幸运

一、认识


TensorFlow.js 中, Tensor 张量 是数据的基本单位, 可以理解为一个多维数组(n 维数组),用于存储数值数据。它是机器学习计算的基本数据结构,与 NumPy 数组类似,但可以在 GPU 上进行高效计算。与 NumPy 数组相比,Tensor 具有以下特点:

  1. 支持 GPU/TPU 加速:Tensor 可以在 CPUGPUTPU 上运行,提高计算效率。

  2. 不可变性(Immutable)Tensor 是不可变的,一旦创建,就无法修改其内容(但可以创建新的 Tensor)。

  3. 自动微分:TensorFlow 通过 tf.GradientTape 记录计算过程,以支持自动求导。

Tensorflow.js 中的 Tensor 与神经网络有什么关系?: 在 TensorFlow.jsTF.js)中,Tensor 张量 是数据的基本表示形式,而 神经网络(如 tf.Modeltf.LayersModel)是由多个 Tensor 通过数学运算(如权重更新、激活函数、卷积操作等)构成的模型。因此,Tensor 是神经网络计算的核心单元。神经网络 的计算过程可以看作是对 Tensor 进行一系列数学变换(如矩阵乘法、卷积、归一化等)。如下所示:

  1. 神经网络的输入与输出: 神经网络的输入和输出都是 Tensor。例如,图像分类模型的输入是一个形状为 [batch, height, width, channels]Tensor,输出可能是一个形状为 [batch, num_classes]Tensor(表示分类的概率分布)。

  2. 神经网络的权重和计算: 神经网络的权重和偏置(bias)也是 Tensor

  3. 反向传播与梯度更新: 神经网络的训练依赖 梯度下降反向传播,即通过计算损失函数对权重求梯度,并用 Tensor 进行更新

因此, Tensor神经网络 中的基本数据结构,用于存储输入、权重、激活值和梯度。神经网络 的计算就是对 Tensor 进行一系列数学变换,包括矩阵乘法、激活函数、梯度计算等。

二、Tensor 结构


Tensor {
kept: false,
isDisposedInternal: false,
shape: [],
dtype: 'float32',
size: 1,
strides: [],
dataId: { id: 0 },
id: 0,
rankType: '0'
}
  • shape 形状: Tensor.shape 形状 决定了数据的维度。例如: 标量(0 维):tf.scalar(5); 向量(1 维):tf.tensor([1, 2, 3]); 矩阵(2 维):tf.tensor([[1, 2], [3, 4]]); 高维张量(3D 及以上):用于图像、序列数据等;

三、创建 Tensor


TensorFlow 中,可以使用 tf.tensortf.constanttf.Variable 来创建 Tensor

3.1 tf.tensor

const tf = require("@tensorflow/tfjs");

// 创建一个标量张量(单个数值)
const t0 = tf.tensor(1);
// 打印张量 t0 的值
t0.print();
console.log("t0", t0);

// 创建一个一维张量(数组)
const t1 = tf.tensor([1, 2, 3, 4]);
// 打印张量 t1 的值
t1.print();
console.log("t1", t1);

// 创建一个二维张量(矩阵)
const t2 = tf.tensor([
[1, 2],
[3, 4],
[5, 6],
]);
// 打印张量 t2 的值
t2.print();
console.log("t2", t2);

// 创建一个三维张量
const t3 = tf.tensor([
[
[1, 2],
[3, 4],
],
[
[5, 6],
[7, 8],
],
]);
// 打印张量 t3 的值
t3.print();
console.log("t3", t3);

3.2 tf.constant

tf.constant 适用于创建不可变的张量。

import tensorflow as tf

# 创建一个 1D Tensor
tensor1 = tf.constant([1, 2, 3])
print(tensor1)

# 创建一个 2D Tensor
tensor2 = tf.constant([[1, 2], [3, 4]])
print(tensor2)

3.3 tf.Variable

如果需要一个可变的张量(可以更新值),可以使用 tf.Variable

var = tf.Variable([1.0, 2.0, 3.0])
print(var)

# 修改变量
var.assign([4.0, 5.0, 6.0])
print(var)

四、计算 Tensor


a = tf.constant([[1, 2], [3, 4]])
b = tf.constant([[5, 6], [7, 8]])

# 加法
print(tf.add(a, b)) # [[6, 8], [10, 12]]

# 乘法
print(tf.multiply(a, b)) # [[5, 12], [21, 32]]

# 矩阵乘法
print(tf.matmul(a, b)) # [[19, 22], [43, 50]]