6. 正则化 Dropout

正则化用于防止模型过拟合,而Dropout是一种常用的正则化手段,通过以一定概率将隐藏层节点置零。在较浅层网络中,这一概率通常较低。训练时,Dropout层会介入,简化实现可以借助接口直接应用到网络中。
摘要由CSDN通过智能技术生成

正则化

  1. 正则化主要是为了减少模型的过拟合,就像激活函数是为了增加网络的非线性。
  2. Dropout只是其中的一种方法,主要是以一个概率将隐藏层的隐藏单元置为0
    在这里插入图片描述3. 通常越浅层网络置0的概率越低。
import tensorflow as tf
from d2l import tensorflow as d2l

# 正则化 以dropout的概率丢弃张量输入X中的元素
def dropout_layer(X, dropout):
  # 断言 判断dropout是否在0-1
  assert 0 <= dropout <= 1
  # 概率为1时全部丢弃
  if dropout == 1:
    return tf.zeros_like(X)
  # 概率为0时不丢弃任何元素
  if dropout == 0:
    return X
  # tf.random.uniform产生的是大小与X一致的张量,里面的元素在0-1之间
  # mask张量里面的值全是0或1,实现了丢弃概率为dropout
  mask = tf.random.uniform(
      shape = tf.shape(X), minval=0, maxval=1) < 1-dropout
  # mask里的元素为1,对应的X元素不变,mask为0,X的元素对应变成0
  # 除以(1-dropoup)是为了保持期望不变,假设X有n个元素,期望为E
  # 所以变化前总的为 nE   
  # 变化后只有(1-dropout)n个元素有值 (1-dropout)nE
  # 右边除掉(1-dropout)均值就相同了,当然不要想着完全相同,毕竟概率这种事情
  return tf.cast(mask, dtype=tf.float32) * X / (1.0 - dropout)

# 定义模型参数
num_outputs, num_hiddens1, num_hiddens2 = 10, 256, 256

# 定义模型
# 设置dropout概率
dropout1, dropout2 = 0.2, 0.5

class Net(tf.keras.Model):
  # 初始化定义网络层,3层网络
  def __init__(self, num_outputs, num_hiddens1, num_hiddens2):
    super().__init__()
    # 输入层把数据拉成一维
    self.input_layer = tf.keras.layers.Flatten(
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在PyTorch,可以使用正则化dropout来提高模型的泛化能力和防止过拟合。 1. 正则化(Regularization): 正则化是通过在损失函数引入模型参数的惩罚项来减小模型的复杂度。常见的正则化方法有L1正则化和L2正则化。 - L1正则化(L1 Regularization):通过在损失函数添加模型权重的绝对值之和作为惩罚项。这可以促使模型权重变得稀疏,即某些权重趋近于零。 ```python loss = criterion(output, target) l1_lambda = 0.01 # L1正则化系数 l1_regularization = torch.tensor(0, dtype=torch.float32) for param in model.parameters(): l1_regularization += torch.norm(param, 1) loss += l1_lambda * l1_regularization ``` - L2正则化(L2 Regularization):通过在损失函数添加模型权重的平方和作为惩罚项。这可以使权重趋向于较小的值,但不会使其为零。 ```python loss = criterion(output, target) l2_lambda = 0.01 # L2正则化系数 l2_regularization = torch.tensor(0, dtype=torch.float32) for param in model.parameters(): l2_regularization += torch.norm(param, 2) loss += l2_lambda * l2_regularization ``` 2. Dropout: Dropout是一种在训练过程随机丢弃一部分神经元以减少模型过拟合的技术。它在每个训练批次以一定的概率将神经元的输出置为零,使得网络不依赖于特定的神经元,从而提高了模型的泛化能力。 在PyTorch,可以使用`torch.nn.Dropout`来添加Dropout层到模型: ```python import torch.nn as nn # 在模型的定义添加Dropout层 class MyModel(nn.Module): def __init__(self): super(MyModel, self).__init__() self.dropout = nn.Dropout(p=0.5) # dropout概率为0.5 # 其他网络层的定义... def forward(self, x): x = self.dropout(x) # 其他网络层的计算... return x ``` 在训练过程,模型会自动应用Dropout,并在评估或推理时关闭Dropout以获得更稳定的预测结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值