深度学习常用方法(一)

1. Dropout 的原理

Dropout 是一种防止神经网络过拟合(学习得过于复杂,导致泛化能力差)的方法。

  • 原理:在每次训练时,随机“丢弃”一部分神经元(即暂时让它们失效,设置为零),让网络无法过度依赖某些特定神经元。测试时则不会丢弃。
  • 通俗类比:想象一个篮球队总是依赖明星球员。如果让明星球员随机休息,其他队员会被迫提高自己的能力,这样整个团队会变得更强。
适合应用场景
  • 用于全连接层(Fully Connected Layer),尤其是在模型容易过拟合的情况下。
  • 不适合用于卷积层,因为卷积层权重共享,丢弃局部特征可能会破坏结构。
import torch
import torch.nn as nn
import torch.nn.functional as F

# 定义一个简单的模型,包含 Dropout
class DropoutModel(nn.Module):
    def __init__(self):
        super(DropoutModel, self).__init__()
        self.fc1 = nn.Linear(784, 256)   # 全连接层,输入为 784 (例如 28x28 的图像)输出为256
        self.dropout = nn.Dropout(p=0.5) # Dropout 层,概率为 0.5
        self.fc2 = nn.Linear(256, 10)   # 输出层,输出为 10 类(例如数字分类)

    def forward(self, x):
        x = F.relu(self.fc1(x))         # 激活函数
        x = self.dropout(x)            # 应用 Dropout
        x = self.fc2(x)                # 输出层,
        return x

# 创建模型实例
dropout_model = DropoutModel()
print(dropout_model)
  • 关键点:
    • nn.Dropout(p=0.5)p 是丢弃的概率,默认为 0.5。
    • 测试时,Dropout 自动关闭,不需要额外设置。

 

2. Batch Normalization(Batch Norm)的原理

Batch Norm 是一种加速训练和提高模型稳定性的方法。

  • 原理:对每一层的输入进行归一化处理,使其分布更平滑(均值为 0,标准差为 1),并引入两个可学习参数(缩放和偏移)来保持灵活性。这减少了梯度消失或爆炸的风险,同时加速了收敛。
  • 通俗类比:想象一个团队中的人能力差异很大。通过培训(归一化)让每个人能力大致相当,这样分配任务时效率会更高。
适合应用场景
  • 在深层网络的卷积层和全连接层中都适用,尤其是对输入的变化敏感的层。
  • 常用于深度卷积网络(如 ResNet 等),帮助稳定训练。

Dropout 和 Batch Norm 的区别

特性DropoutBatch Normalization
目的防止过拟合,增强泛化能力加速训练,提高稳定性,减少梯度问题
实现方式随机丢弃神经元对每层输入做归一化
使用场景主要用于全连接层适用于全连接层和卷积层
训练和测试区别测试时关闭 Dropout(使用缩放后的权重)测试时使用固定均值和方差
副作用可能降低网络容量额外引入计算开销和参数

 总结

  • Dropout 更注重防止过拟合,Batch Norm 更关注训练的速度和稳定性。
  • 在实际应用中,两者可以结合使用:Dropout 多用于全连接层,Batch Norm 多用于卷积层。
  • 根据场景需求,还可以选择其他正则化方法或训练加速策略,如 Layer Norm、数据增强等,灵活搭配效果更佳。
# 定义一个简单的模型,包含 Batch Normalization
class BatchNormModel(nn.Module):
    def __init__(self):
        super(BatchNormModel, self).__init__()
        self.conv1 = nn.Conv2d(3, 16, kernel_size=3, stride=1, padding=1)  # 卷积层
        self.bn1 = nn.BatchNorm2d(16)  # Batch Norm 层(针对卷积层输出的特征图)
        self.conv2 = nn.Conv2d(16, 32, kernel_size=3, stride=1, padding=1)
        self.bn2 = nn.BatchNorm2d(32)
        self.fc1 = nn.Linear(32 * 8 * 8, 128)
        self.bn_fc = nn.BatchNorm1d(128)  # Batch Norm 层(针对全连接层输出)

    def forward(self, x):
        x = F.relu(self.bn1(self.conv1(x)))  # 卷积 + Batch Norm + 激活
        x = F.relu(self.bn2(self.conv2(x)))  # 卷积 + Batch Norm + 激活
        x = F.adaptive_avg_pool2d(x, (8, 8))  # 自适应平均池化
        x = x.view(x.size(0), -1)            # 展平特征图
        x = F.relu(self.bn_fc(self.fc1(x)))  # 全连接层 + Batch Norm + 激活
        return x

# 创建模型实例
batchnorm_model = BatchNormModel()
print(batchnorm_model)

 关键点:

  • 对卷积层使用 nn.BatchNorm2d(num_features)num_features 是卷积输出的通道数。
  • 对全连接层使用 nn.BatchNorm1d(num_features)num_features 是输出的特征数。
  • 测试时,Batch Norm 会固定均值和方差,不需要手动调整。

结合 Dropout 和 Batch Norm 的完整模型

 

class CombinedModel(nn.Module):
    def __init__(self):
        super(CombinedModel, self).__init__()
        self.conv1 = nn.Conv2d(3, 16, kernel_size=3, stride=1, padding=1)
        self.bn1 = nn.BatchNorm2d(16)
        self.conv2 = nn.Conv2d(16, 32, kernel_size=3, stride=1, padding=1)
        self.bn2 = nn.BatchNorm2d(32)
        self.fc1 = nn.Linear(32 * 8 * 8, 128)
        self.bn_fc = nn.BatchNorm1d(128)
        self.dropout = nn.Dropout(p=0.5)
        self.fc2 = nn.Linear(128, 10)

    def forward(self, x):
        x = F.relu(self.bn1(self.conv1(x)))
        x = F.relu(self.bn2(self.conv2(x)))
        x = F.adaptive_avg_pool2d(x, (8, 8))
        x = x.view(x.size(0), -1)
        x = F.relu(self.bn_fc(self.fc1(x)))
        x = self.dropout(x)  # 在全连接层使用 Dropout
        x = self.fc2(x)
        return x

# 创建模型实例
combined_model = CombinedModel()
print(combined_model)
  • 结合使用:
    • Dropout 常用于全连接层,减少过拟合。
    • Batch Norm 用于卷积层和全连接层,提高训练效率和稳定性。

 训练代码框架

# 假设输入图像尺寸为 3x32x32
x = torch.randn(16, 3, 32, 32)  # 16 个样本的批次

# 初始化模型
model = CombinedModel()

# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)

# 模拟前向传播
outputs = model(x)
labels = torch.randint(0, 10, (16,))  # 随机生成 16 个标签
loss = criterion(outputs, labels)

# 反向传播和优化
loss.backward()
optimizer.step()

print(f"Loss: {loss.item():.4f}")

 


其他类似作用的方法

  1. Layer Normalization (LN):

    • 类似于 Batch Norm,但作用在每一层的神经元输出,而不是 Batch 中的样本。
    • 更适合 RNN 等小批量训练场景。
  2. Group Normalization (GN):

    • 将神经元划分为小组,每组独立归一化。
    • 适用于小批量或分布式训练,尤其是计算资源有限时。
  3. Weight Decay (权重衰减):

    • 在优化过程中,对权重引入 L2 正则化,防止过拟合。
  4. Early Stopping (提前停止):

    • 监控验证集的性能,当验证集性能不再提升时停止训练。
  5. Data Augmentation (数据增强):

    • 增加数据的多样性,比如对图片翻转、裁剪、添加噪声等,防止模型过拟合。
  6. Mixup:

    • 将不同样本的数据和标签随机线性混合,从而增强训练数据的多样性。
  7. Stochastic Depth:

    • 在 ResNet 这种深层网络中,随机让一些残差块“跳过”,从而达到类似 Dropout 的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值