张量Tensor是什么?
在深度学习中,我们经常会遇到一个概念:张量Tensor。那么,张量Tensor到底是什么呢?它有什么用处呢?
首先,我们要明白一个基本的数学概念:矩阵Matrix。矩阵Matrix是一个由若干个数字按照一定的行列排列组成的表格。例如:
1 | 2 | 3 |
4 | 5 | 6 |
7 | 8 | 9 |
这就是一个3×3的矩阵Matrix,它有3行3列,每个位置上都有一个数字。我们可以用矩阵Matrix来表示很多东西,比如线性方程组、线性变换、向量Vector等等。
向量Vector其实就是一种特殊的矩阵Matrix,它只有一行或者一列。例如:
1 |
2 |
3 |
这就是一个3×1的向量Vector,它只有一列,每个位置上都有一个数字。我们可以用向量Vector来表示很多东西,比如坐标、速度、力等等。
那么,张量Tensor又是什么呢?简单地说,张量Tensor就是一个更高维度的矩阵Matrix。如果矩阵Matrix可以看作是由若干个数字组成的二维表格,那么张量Tensor可以看作是由若干个数字组成的多维立方体(或者其他形状)。例如:
这就是一个2×2×2的张量Tensor,它有2层2行2列。我们可以用张量Tensor来表示很多东西,比如彩色图像、声音信号、神经网络参数等等。
参考: Canonical Forms of 2x2x2 and 2x2x2x2 Tensors
张量的创建
张量Tensor是一个n维的数值数组,可以用来表示复杂的数学对象和运算。在TensorFlow中,张量Tensor是最基本的数据类型,可以用不同的函数来创建。
常用的创建张量Tensor的函数有:
tf.constant (value, dtype=None, shape=None, name=‘’):根据给定的值、数据类型、形状和名称创建一个常量张量Tensor。
tf.zeros (shape, dtype=tf.float32, name=None):根据给定的形状、数据类型和名称创建一个全零张量Tensor。
tf.ones (shape, dtype=tf.float32, name=None):根据给定的形状、数据类型和名称创建一个全一张量Tensor。
tf.fill (dims, value, name=None):根据给定的维度、值和名称创建一个填充指定值的张量Tensor。
tf.linspace (start, stop, num, name=None):根据给定的起始值、终止值和数量创建一个线性分布的张量Tensor。
tf.range (start, limit=None, delta=1, dtype=None,name=‘range’):根据给定的起始值、限制值、步长、数据类型和名称创建一个范围内分布的张量Tensor。
例如:
import tensorflow as tf t1 = tf.constant([1.0 , 2.0 , 3.0]) # 创建一个一维浮点型常量张量 t2 = tf.zeros([2 , 3]) # 创建一个二维全零整型张量 t3 = tf.ones([3 , 4]) # 创建一个三维全一整型张量 t4 = tf.fill([2 , 2], 5) # 创建一个二维填充5 的整型张量 t5 = tf.linspace(10.0 , 13.0 , 4) # 创建一个一维线性分布从10 到13 的浮点型张量 t6 = tf.range(10 , 20 , 2) # 创建一个一维范围从10 到20 步长为2 的整型张量
为什么要用张量Tensor呢?
在深度学习中,我们需要处理很多复杂而高维的数据结构和运算。如果只用普通的矩阵Matrix和向量Vector来表示和计算,可能会非常麻烦和低效。而使用张量Tensor,则可以让我们更方便地存储和操作数据,并且利用其内在的多重线性映射特性来实现各种复杂而高效的运算。
例如,在计算机视觉中,我们常常需要处理彩色图像文件(RGB)。每个彩色图像文件(RGB)都可以看作是一个三维张量Tensor:第一维表示图像中每个像素的位置,第二维表示图像中每个像素的颜色通道(R、G、B),第三维表示每个颜色通道中每个像素的强度(0-255)。例如,一个256×256的彩色图像文件(RGB)就可以表示为一个256×256×3的张量Tensor。
我们可以用PyTorch来加载和处理彩色图像文件(RGB),并将它们转换为张量Tensor。PyTorch提供了一些模块和函数来方便我们操作图像数据,比如torchvision、imageio等。下面是一个简单的示例:
import torch import imageio.v2 # 用于加载图像文件 import torchvision # 用于转换图像格式 img_arr = imageio.v2.imread('../data/image-dog/bobby.jpg') # 加载一张狗狗的图片 img = torch.from_numpy(img_arr) # 将numpy数组转换为张量Tensor img = img.permute(2, 0, 1) # 将张量Tensor的排列顺序从H*W*C变为C*H*W img = img.float() # 将张量Tensor的数据类型从整数变为浮点数 img = img / 255.0 # 将张量Tensor的数据范围从0-255变为0-1 # 或者我们可以直接用torchvision.transforms模块中提供的函数来实现上述操作: transform = torchvision.transforms.Compose([ # 定义一个转换函数,包含多个步骤 torchvision.transforms.ToTensor(), # 将numpy数组或PIL图片转换为张量Tensor,并自动调整排列顺序和数据范围 ]) img = transform(img_arr) # 应用转换函数 print(img.shape) # 打印张量Tensor的形状——> (通道数, 高度, 宽度)
通过上述代码,我们就可以将一张彩色图像文件(RGB)表示为一个三维张量Tensor,并且符合PyTorch处理图像数据的要求。
总结
本文简要介绍了什么是张量Tensor,以及如何将彩色图像文件(RGB)表示为张量Tensor。我们了解了张量Tensor是一种多维数组,可以用来存储和操作高维数据结构。并学习了如何用PyTorch来加载和处理彩色图像文件(RGB),并将它们转换为适合深度学习模型使用的张量Tensor。
推荐学习视频:What’s a Tensor?