知识点回顾:
- 随机张量的生成:torch.randn函数
- 卷积和池化的计算公式(可以不掌握,会自动计算的)
- pytorch的广播机制:加法和乘法的广播机制
ps:numpy运算也有类似的广播机制,基本一致
作业:自己多借助ai举几个例子帮助自己理解即可
torch.randn函数
import torch
# 生成标量(0维张量)
scalar = torch.randn(())
print(f"标量: {scalar}, 形状: {scalar.shape}")
# 生成向量(1维张量)
vector = torch.randn(5) # 长度为5的向量
print(f"向量: {vector}, 形状: {vector.shape}")
# 生成矩阵(2维张量)
matrix = torch.randn(3, 4) # 3行4列的矩阵
print(f"矩阵:{matrix},矩阵形状: {matrix.shape}")
# 生成3维张量(常用于图像数据的通道、高度、宽度)
tensor_3d = torch.randn(3, 224, 224) # 3通道,高224,宽224
print(f"3维张量形状: {tensor_3d.shape}") # 输出: torch.Size([3, 224, 224])
# 生成4维张量(常用于批量图像数据:[batch, channel, height, width])
tensor_4d = torch.randn(2, 3, 224, 224) # 批量大小为2,3通道,高224,宽224
print(f"4维张量形状: {tensor_4d.shape}") # 输出: torch.Size([2, 3, 224, 224])
其他随机函数
x = torch.rand(3, 2) # 生成3x2的张量
print(f"均匀分布随机数: {x}, 形状: {x.shape}")
x = torch.randint(low=0, high=10, size=(3,)) # 生成3个0到9之间的整数
print(f"随机整数: {x}, 形状: {x.shape}")
mean = torch.tensor([0.0, 0.0])
std = torch.tensor([1.0, 2.0])
x = torch.normal(mean, std) # 生成两个正态分布随机数
print(f"正态分布随机数: {x}, 形状: {x.shape}")
# 一维张量与二维张量相加
a = torch.tensor([[1, 2, 3], [4, 5, 6]]) # 形状: (2, 3)
b = torch.tensor([10, 20, 30]) # 形状: (3,)
# 广播后:b被扩展为[[10, 20, 30], [10, 20, 30]]
result = a + b
result
输出维度测试
import torch
import torch.nn as nn
# 生成输入张量 (批量大小, 通道数, 高度, 宽度)
input_tensor = torch.randn(1, 3, 32, 32) # 例如CIFAR-10图像
print(f"输入尺寸: {input_tensor.shape}") # 输出: [1, 3, 32, 32]
# 1. 卷积层操作
conv1 = nn.Conv2d(
in_channels=3, # 输入通道数
out_channels=16, # 输出通道数(卷积核数量)
kernel_size=3, # 卷积核大小
stride=1, # 步长
padding=1 # 填充
)
conv_output = conv1(input_tensor) # 由于 padding=1 且 stride=1,空间尺寸保持不变
print(f"卷积后尺寸: {conv_output.shape}") # 输出: [1, 16, 32, 32]
# 2. 池化层操作 (减小空间尺寸)
pool = nn.MaxPool2d(kernel_size=2, stride=2) # 创建一个最大池化层
pool_output = pool(conv_output)
print(f"池化后尺寸: {pool_output.shape}") # 输出: [1, 16, 16, 16]
# 3. 将多维张量展平为向量
flattened = pool_output.view(pool_output.size(0), -1)
print(f"展平后尺寸: {flattened.shape}") # 输出: [1, 4096] (16*16*16=4096)
# 4. 线性层操作
fc1 = nn.Linear(
in_features=4096, # 输入特征数
out_features=128 # 输出特征数
)
fc_output = fc1(flattened)
print(f"线性层后尺寸: {fc_output.shape}") # 输出: [1, 128]
# 5. 再经过一个线性层(例如分类器)
fc2 = nn.Linear(128, 10) # 假设是10分类问题
final_output = fc2(fc_output)
print(f"最终输出尺寸: {final_output.shape}") # 输出: [1, 10]
print(final_output)
# 使用Softmax替代Sigmoid
softmax = nn.Softmax(dim=1) # 在类别维度上进行Softmax
class_probs = softmax(final_output)
print(f"Softmax输出: {class_probs}") # 总和为1的概率分布
print(f"Softmax输出总和: {class_probs.sum():.4f}")
广播机制的概念
广播机制(Broadcasting)是深度学习框架(如NumPy、PyTorch、TensorFlow)中处理不同形状数组运算的一种规则。它允许在逐元素操作中自动扩展较小数组的形状,使其与较大数组匹配,从而避免显式复制数据。
广播的核心规则
形状对齐:从末尾维度开始比较,两个数组的维度必须满足以下条件之一:
- 相等
- 其中一方为1
- 其中一方缺失该维度
扩展补全:满足对齐条件后,数值会沿长度为1的维度复制扩展。
广播的示例
假设有一个3×4的矩阵 A
和一个长度为4的向量 B
:
A
的形状:(3, 4)B
的形状:(4,) → 自动补齐为 (1, 4) → 再扩展为 (3, 4)
此时A + B
会逐元素相加。
应用场景
- 矩阵与向量相加(如偏置项)
- 不同维度的张量相乘(如注意力机制中的缩放)
- 数据归一化时减去均值(形状自动匹配)
常见限制
若形状无法对齐(如3×4矩阵与3×1矩阵相加),会触发错误。需手动调整维度(如使用 reshape
或 unsqueeze
)。
广播机制显著提升了代码简洁性和计算效率,但需注意隐性内存消耗。
维度扩展的规则通常涉及数学、数据科学、机器学习等领域,具体规则取决于应用场景和目标。以下是常见的维度扩展方法和规则:
维度扩展的常见方法
多项式特征扩展
通过生成原始特征的高阶组合(如平方、交叉项)来增加维度。例如,原始特征为 (x_1, x_2),扩展后可包含 (x_1^2, x_2^2, x_1x_2)。
核方法(Kernel Methods)
利用核函数将低维数据映射到高维空间,如径向基函数(RBF)核或多项式核,无需显式计算高维特征。
嵌入学习(Embedding)
通过模型(如Word2Vec、BERT)将离散特征(如文本、类别)转换为连续的高维向量。
离散化与分箱(Binning)
将连续特征划分为多个区间(如年龄分组),生成哑变量(One-Hot编码)以扩展维度。
注意:
维度灾难(Curse of Dimensionality)
过度扩展可能导致数据稀疏性增加,模型性能下降。需平衡维度与样本量。
特征相关性
扩展的特征应与目标变量存在潜在关联,避免无效扩展。可通过特征选择方法筛选。
计算效率
高维数据可能显著增加计算成本,需考虑稀疏存储或分布式计算优化。
具体方法的选择需结合问题类型(如分类、回归)和数据特性(如数值、文本)。