用Python和NumPy实战张量从标量到视频数据的5个编程实例当你第一次在PyTorch或TensorFlow中看到张量这个概念时是否感到困惑别担心你不是一个人。许多机器学习初学者都会被这个看似高深的数学概念吓到。但事实上张量比你想象的要简单得多——它们只是多维数组的另一个名字。本文将带你用Python和NumPy通过5个层层递进的实例从零开始构建和理解不同维度的张量。1. 张量基础从Python列表到NumPy数组在深入张量之前我们需要先理解它的基础构建块。张量本质上是一种数据结构可以看作是标量、向量和矩阵的高维推广。让我们从最基础的Python数据结构开始import numpy as np # 标量 - 0阶张量 scalar_python 42 scalar_numpy np.array(42) print(fPython标量: {scalar_python}, 类型: {type(scalar_python)}) print(fNumPy标量: {scalar_numpy}, 类型: {type(scalar_numpy)}, 形状: {scalar_numpy.shape})输出结果Python标量: 42, 类型: class int NumPy标量: 42, 类型: class numpy.ndarray, 形状: ()关键区别Python原生标量没有形状概念NumPy数组即使是标量也有形状属性空元组表示0维提示在深度学习中即使是单个数值也通常用NumPy数组或张量表示以保持数据类型一致性。2. 一阶张量向量操作实战一阶张量就是向量即一维数组。让我们创建一个表示3D空间中点的向量# 创建向量 vector np.array([1.0, 2.0, 3.0]) # 向量运算示例 another_vector np.array([4.0, 5.0, 6.0]) vector_add vector another_vector vector_dot np.dot(vector, another_vector) print(f向量加法结果: {vector_add}) print(f向量点积结果: {vector_dot})输出向量加法结果: [5. 7. 9.] 向量点积结果: 32.0向量操作要点操作类型示例代码数学表示加法a b$\mathbf{a} \mathbf{b}$点积np.dot(a, b)$\mathbf{a} \cdot \mathbf{b}$范数np.linalg.norm(a)$|\mathbf{a}|$标量乘法3 * a$3\mathbf{a}$3. 二阶张量矩阵运算与图像表示二阶张量就是矩阵它在深度学习中无处不在。让我们创建一个表示灰度图像的矩阵# 创建一个3x3的灰度图像矩阵 gray_image np.array([ [0, 127, 255], [64, 191, 32], [128, 96, 224] ], dtypenp.uint8) # 矩阵转置 transposed gray_image.T # 矩阵乘法 kernel np.array([[1, 0, -1], [1, 0, -1], [1, 0, -1]]) filtered np.dot(gray_image, kernel) print(原始图像矩阵:\n, gray_image) print(\n转置矩阵:\n, transposed) print(\n滤波后矩阵:\n, filtered)矩阵在深度学习中的典型应用全连接层的权重表示卷积核的表示特征图的组织注意矩阵乘法(np.dot)与逐元素乘法(*)完全不同这是初学者常犯的错误。4. 三阶张量RGB图像处理三阶张量可以完美表示彩色图像。让我们构建一个3x3的RGB图像# 创建一个3x3x3的RGB图像张量 rgb_image np.array([ [[255, 0, 0], [0, 255, 0], [0, 0, 255]], # 第一行红、绿、蓝 [[255, 255, 0], [255, 0, 255], [0, 255, 255]], # 第二行黄、品红、青 [[255, 255, 255], [128, 128, 128], [0, 0, 0]] # 第三行白、灰、黑 ], dtypenp.uint8) # 提取红色通道 red_channel rgb_image[:, :, 0] # 转换为灰度图像 weights np.array([0.299, 0.587, 0.114]) gray_scale np.dot(rgb_image, weights) print(RGB图像形状:, rgb_image.shape) print(\n红色通道:\n, red_channel) print(\n灰度图像:\n, gray_scale)三阶张量的轴解释轴0图像高度行轴1图像宽度列轴2颜色通道RGB5. 四阶与五阶张量批量处理与视频数据在实际深度学习中我们很少处理单个数据样本而是批量处理。四阶张量可以表示一批图像五阶张量则可以表示视频数据。# 创建一批4张3x3的RGB图像 batch_size 4 image_batch np.random.randint(0, 256, size(batch_size, 3, 3, 3), dtypenp.uint8) # 创建视频数据 (2个视频每个3帧3x3 RGB) video_data np.random.randint(0, 256, size(2, 3, 3, 3, 3), dtypenp.uint8) print(图像批次形状:, image_batch.shape) print(视频数据形状:, video_data.shape) # 批量归一化示例 normalized_batch image_batch / 255.0 print(\n归一化后的批次数据范围:, normalized_batch.min(), to, normalized_batch.max())高阶张量的轴含义张量阶数示例轴含义4阶图像批次(样本数, 高度, 宽度, 通道)5阶视频数据(视频数, 帧数, 高度, 宽度, 通道)6. 张量操作进阶技巧掌握了基本概念后让我们看看NumPy中一些实用的张量操作技巧# 重塑张量 matrix np.arange(9).reshape(3, 3) # 转置 transposed matrix.T # 轴交换 (对于高阶张量特别有用) rgb_image_modified np.moveaxis(rgb_image, 2, 0) # 将通道轴移到最前面 # 广播机制 matrix_a np.array([[1, 2], [3, 4]]) vector_b np.array([10, 20]) result matrix_a vector_b # 向量被广播到与矩阵相同的形状 print(原始矩阵:\n, matrix) print(\n转置矩阵:\n, transposed) print(\n轴交换后的图像形状:, rgb_image_modified.shape) print(\n广播结果:\n, result)常用张量操作对比表操作函数适用场景重塑reshape()改变张量形状而不改变数据转置T或transpose()交换二维张量的行列轴交换moveaxis()重新排列高阶张量的轴顺序拼接concatenate()沿指定轴合并张量分割split()将张量分割为多个子张量7. 从NumPy到深度学习框架理解了NumPy中的张量后过渡到深度学习框架就非常自然了。以PyTorch为例import torch # 将NumPy数组转换为PyTorch张量 numpy_array np.random.rand(3, 3) torch_tensor torch.from_numpy(numpy_array) # GPU支持 (如果有的话) if torch.cuda.is_available(): torch_tensor torch_tensor.cuda() # 自动微分 x torch.tensor([2.0], requires_gradTrue) y x ** 2 3 * x 1 y.backward() print(\nx的梯度:, x.grad)NumPy与PyTorch张量对比特性NumPy数组PyTorch张量GPU支持无有自动微分无有接口相似度-高度相似主要用途通用数值计算深度学习在实际项目中你可能会频繁地在NumPy数组和框架张量之间转换。理解它们的相似性和差异非常重要。
别再死记硬背了!用Python和NumPy从零理解张量:从标量到视频数据的5个实例
用Python和NumPy实战张量从标量到视频数据的5个编程实例当你第一次在PyTorch或TensorFlow中看到张量这个概念时是否感到困惑别担心你不是一个人。许多机器学习初学者都会被这个看似高深的数学概念吓到。但事实上张量比你想象的要简单得多——它们只是多维数组的另一个名字。本文将带你用Python和NumPy通过5个层层递进的实例从零开始构建和理解不同维度的张量。1. 张量基础从Python列表到NumPy数组在深入张量之前我们需要先理解它的基础构建块。张量本质上是一种数据结构可以看作是标量、向量和矩阵的高维推广。让我们从最基础的Python数据结构开始import numpy as np # 标量 - 0阶张量 scalar_python 42 scalar_numpy np.array(42) print(fPython标量: {scalar_python}, 类型: {type(scalar_python)}) print(fNumPy标量: {scalar_numpy}, 类型: {type(scalar_numpy)}, 形状: {scalar_numpy.shape})输出结果Python标量: 42, 类型: class int NumPy标量: 42, 类型: class numpy.ndarray, 形状: ()关键区别Python原生标量没有形状概念NumPy数组即使是标量也有形状属性空元组表示0维提示在深度学习中即使是单个数值也通常用NumPy数组或张量表示以保持数据类型一致性。2. 一阶张量向量操作实战一阶张量就是向量即一维数组。让我们创建一个表示3D空间中点的向量# 创建向量 vector np.array([1.0, 2.0, 3.0]) # 向量运算示例 another_vector np.array([4.0, 5.0, 6.0]) vector_add vector another_vector vector_dot np.dot(vector, another_vector) print(f向量加法结果: {vector_add}) print(f向量点积结果: {vector_dot})输出向量加法结果: [5. 7. 9.] 向量点积结果: 32.0向量操作要点操作类型示例代码数学表示加法a b$\mathbf{a} \mathbf{b}$点积np.dot(a, b)$\mathbf{a} \cdot \mathbf{b}$范数np.linalg.norm(a)$|\mathbf{a}|$标量乘法3 * a$3\mathbf{a}$3. 二阶张量矩阵运算与图像表示二阶张量就是矩阵它在深度学习中无处不在。让我们创建一个表示灰度图像的矩阵# 创建一个3x3的灰度图像矩阵 gray_image np.array([ [0, 127, 255], [64, 191, 32], [128, 96, 224] ], dtypenp.uint8) # 矩阵转置 transposed gray_image.T # 矩阵乘法 kernel np.array([[1, 0, -1], [1, 0, -1], [1, 0, -1]]) filtered np.dot(gray_image, kernel) print(原始图像矩阵:\n, gray_image) print(\n转置矩阵:\n, transposed) print(\n滤波后矩阵:\n, filtered)矩阵在深度学习中的典型应用全连接层的权重表示卷积核的表示特征图的组织注意矩阵乘法(np.dot)与逐元素乘法(*)完全不同这是初学者常犯的错误。4. 三阶张量RGB图像处理三阶张量可以完美表示彩色图像。让我们构建一个3x3的RGB图像# 创建一个3x3x3的RGB图像张量 rgb_image np.array([ [[255, 0, 0], [0, 255, 0], [0, 0, 255]], # 第一行红、绿、蓝 [[255, 255, 0], [255, 0, 255], [0, 255, 255]], # 第二行黄、品红、青 [[255, 255, 255], [128, 128, 128], [0, 0, 0]] # 第三行白、灰、黑 ], dtypenp.uint8) # 提取红色通道 red_channel rgb_image[:, :, 0] # 转换为灰度图像 weights np.array([0.299, 0.587, 0.114]) gray_scale np.dot(rgb_image, weights) print(RGB图像形状:, rgb_image.shape) print(\n红色通道:\n, red_channel) print(\n灰度图像:\n, gray_scale)三阶张量的轴解释轴0图像高度行轴1图像宽度列轴2颜色通道RGB5. 四阶与五阶张量批量处理与视频数据在实际深度学习中我们很少处理单个数据样本而是批量处理。四阶张量可以表示一批图像五阶张量则可以表示视频数据。# 创建一批4张3x3的RGB图像 batch_size 4 image_batch np.random.randint(0, 256, size(batch_size, 3, 3, 3), dtypenp.uint8) # 创建视频数据 (2个视频每个3帧3x3 RGB) video_data np.random.randint(0, 256, size(2, 3, 3, 3, 3), dtypenp.uint8) print(图像批次形状:, image_batch.shape) print(视频数据形状:, video_data.shape) # 批量归一化示例 normalized_batch image_batch / 255.0 print(\n归一化后的批次数据范围:, normalized_batch.min(), to, normalized_batch.max())高阶张量的轴含义张量阶数示例轴含义4阶图像批次(样本数, 高度, 宽度, 通道)5阶视频数据(视频数, 帧数, 高度, 宽度, 通道)6. 张量操作进阶技巧掌握了基本概念后让我们看看NumPy中一些实用的张量操作技巧# 重塑张量 matrix np.arange(9).reshape(3, 3) # 转置 transposed matrix.T # 轴交换 (对于高阶张量特别有用) rgb_image_modified np.moveaxis(rgb_image, 2, 0) # 将通道轴移到最前面 # 广播机制 matrix_a np.array([[1, 2], [3, 4]]) vector_b np.array([10, 20]) result matrix_a vector_b # 向量被广播到与矩阵相同的形状 print(原始矩阵:\n, matrix) print(\n转置矩阵:\n, transposed) print(\n轴交换后的图像形状:, rgb_image_modified.shape) print(\n广播结果:\n, result)常用张量操作对比表操作函数适用场景重塑reshape()改变张量形状而不改变数据转置T或transpose()交换二维张量的行列轴交换moveaxis()重新排列高阶张量的轴顺序拼接concatenate()沿指定轴合并张量分割split()将张量分割为多个子张量7. 从NumPy到深度学习框架理解了NumPy中的张量后过渡到深度学习框架就非常自然了。以PyTorch为例import torch # 将NumPy数组转换为PyTorch张量 numpy_array np.random.rand(3, 3) torch_tensor torch.from_numpy(numpy_array) # GPU支持 (如果有的话) if torch.cuda.is_available(): torch_tensor torch_tensor.cuda() # 自动微分 x torch.tensor([2.0], requires_gradTrue) y x ** 2 3 * x 1 y.backward() print(\nx的梯度:, x.grad)NumPy与PyTorch张量对比特性NumPy数组PyTorch张量GPU支持无有自动微分无有接口相似度-高度相似主要用途通用数值计算深度学习在实际项目中你可能会频繁地在NumPy数组和框架张量之间转换。理解它们的相似性和差异非常重要。