数据操作

Q1:什么是张量

在机器学习中,张量(Tensor) 是一种通用的数据表示方式,类似于标量(数值)、向量和矩阵,但可以扩展到任意维度。它是深度学习框架(如 PyTorch 和 TensorFlow)中的核心数据结构,用于表示输入数据、参数和计算结果。

  • 标量(0维张量)
  • 向量(1维张量)
  • 矩阵(2维张量)
  • 高维张量(3维及以上)

张量的特点

  1. 多维数组:张量是多维的、灵活的数组结构。
  2. 通用性:从标量到高维数组,张量是一种统一的数学表示。
  3. 维度(rank):张量的维度表示其“轴”的数量。例如,2维张量有 2 个轴。
  4. 形状(shape):张量每个维度的大小。例如,一个形状为 (3, 4, 5) 的张量有 3 个维度,分别包含 4 行、5 列。

张量在机器学习中的作用

  1. 表示数据:如输入的图片、文本、音频或视频都可以表示为张量。
    • 图像:通常是 3维张量(高度×宽度×通道)。
    • 批量处理:常用 4维张量(批量大小×高度×宽度×通道)。
  2. 表示模型参数:例如,神经网络的权重和偏置都是张量。
  3. 计算操作:张量是模型训练和推理的基本操作单元,支持线性代数(如矩阵乘法)、广播、卷积等操作。

Q2:什么是广播机制


错误示例

这是由于张量 xy形状不匹配导致的问题
在 PyTorch 中,张量之间的算术运算要求它们的形状是相同的,或者可以通过广播机制使它们形状对齐
当执行 x + y 时,PyTorch 会尝试对两个张量进行广播。广播的规则是:

  1. 从后往前匹配每个维度
  2. 如果两个张量的对应维度:
    • 相等,则匹配成功
    • 其中一个维度为 1,则该维度可以广播
    • 其他情况,则报错
1
2
x: (2, 2, 3)
y: (1, 4, 3)
  • 第三维(列):33 相等,匹配成功
  • 第二维(行):24 不相等,且没有为 1 的维度,无法广播,导致报错
  • 第一维(块数):21,可以广播(无问题)

因此,报错来源是 第二维(行)的大小不一致

解决方法
根据需求调整张量的形状,使它们在第二维匹配或适配广播规则

方法 1:调整 y 的形状
如果需要在第二维将 y 的行数匹配到 x 的行数,可以用 reshaperepeat

1
2
y_new = y.reshape(1, 2, 2, 3).sum(dim=2)  # 将第二维的 4 压缩成 2
print(x + y_new)

方法 2:调整 x 的形状
如果需要在第二维将 x 的行数扩展到与 y 一样,可以使用 repeat

1
2
x_new = x.repeat(1, 2, 1)  # 重复第二维
print(x_new + y)

方法 3:明确广播意图
如果是逐块运算,可以明确指定目标操作。例如:

1
2
3
x_expanded = x.unsqueeze(1)  # 调整形状为 (2, 1, 2, 3)
y_expanded = y.unsqueeze(0) # 调整形状为 (1, 1, 4, 3)
result = x_expanded + y_expanded # 广播

Q3:tensor与numpy转换时是否共享内存


演示如下

数据预处理

python操作文件的读取和写入

1
2
3
4
5
6
7
8
9
10
11
12
13
import os
import pandas as pd
os.makedirs(os.path.join('..', 'data'), exist_ok=True) # 在当前目录的父目录下创建名为data的文件夹
data_file = os.path.join('..', 'data', 'house_tiny.csv') # 在当前目录的父目录下的data文件夹中创建名为house_tiny.csv的文件
with open(data_file, 'w') as f: # 以写入的方式打开文件,如果文件不存在,会自动创建;如果文件已经存在,则会覆盖其内容
f.write('NumRooms,Alley,Price\n')
f.write('NA,Pave,127500\n')
f.write('2,NA,106000\n')
f.write('4,NA,178100\n')
f.write('NA,NA,140000\n')

data = pd.read_csv(data_file)
print(data)
1
2
3
4
5
6
7
8
9
10
11
12
13
import os
import pandas as pd
os.makedirs(os.path.join('data'), exist_ok=True) # 在当前目录下创建名为data的文件夹
data_file = os.path.join('data', 'house_tiny.csv') # 在当前目录下的data文件夹中创建名为house_tiny.csv的文件
with open(data_file, 'w') as f:
f.write('NumRooms,Alley,Price\n') # 列名
f.write('NA,Pave,127500\n') # 每行表示一个数据样本
f.write('2,NA,106000\n')
f.write('4,NA,178100\n')
f.write('NA,NA,140000\n')

data = pd.read_csv(data_file)
print(data)

效果如下

线性代数

如何理解线性代数中的范数

线性代数中的范数(norm)是衡量向量大小的一种方法,类似于我们平常说的“长度”或者“距离”。范数可以理解为一种度量工具,用于描述向量在某种意义上的“大小”或者“长度”。它满足一些基本的性质,包括非负性、齐次性、三角不等式等。