dropoutLayer — 丢弃层

丢弃层(Dropout Layer)是深度学习中常用的一种正则化技术,用于减轻过拟合。它的基本操作是通过随机丢弃一部分神经元的输出,以此来减少神经网络的依赖,使得网络更加健壮。

在训练过程中,丢弃层会随机将输入的部分元素设置为零,并通过缩放剩余的元素来保证总输入的期望值不变。这一操作实际上会让每次训练时的网络架构有所不同,从而帮助减少模型的过拟合。

创建 dropoutLayer

你可以使用以下语法来创建一个丢弃层:

layer = dropoutLayer

或者,创建一个具有指定丢弃概率的丢弃层:

layer = dropoutLayer(probability)

还可以指定层的名称:

layer = dropoutLayer(probability, 'Name', 'drop1')

其中,probability 是丢弃输入元素的概率,通常设为小于 1 的非负数。

主要属性

  1. Probability:丢弃输入元素的概率。默认值为 0.5,表示每次训练时随机丢弃一半的神经元输出。

    • 类型:double
    • 示例:如果你设置 probability = 0.4,那么每次训练时大约会丢弃 40% 的神经元输出。
  2. Name:层的名称。默认值为空字符串 ""。你可以为丢弃层指定名称,例如 'drop1'

    • 类型:charstring
  3. NumInputs:层的输入数量,默认为 1,表示丢弃层只接受一个输入。

    • 类型:double
  4. InputNames:输入的名称,默认为 {'in'},表示丢弃层只接受一个输入。

    • 类型:cell
  5. NumOutputs:输出的数量,默认为 1,表示丢弃层只有一个输出。

    • 类型:double
  6. OutputNames:输出的名称,默认为 {'out'},表示丢弃层只有一个输出。

    • 类型:cell

示例:如何使用 dropoutLayer

% 创建一个丢弃层并设置丢弃概率为 0.4
layer = dropoutLayer(0.4, 'Name', 'drop1');

% 在层数组中包含丢弃层
layers = [
    imageInputLayer([28 28 1])           % 输入层
    convolution2dLayer(5, 20)            % 卷积层
    reluLayer                            % ReLU 激活层
    dropoutLayer(0.4)                    % 丢弃层,丢弃概率为 40%
    fullyConnectedLayer(10)              % 全连接层
    softmaxLayer                         % Softmax 层
];

在这个例子中,丢弃层被用于卷积层和全连接层之间,丢弃概率为 0.4。每次训练时,这一层会随机丢弃 40% 的神经元输出,以减少过拟合。

作用和原理

  1. 防止过拟合:丢弃层通过减少每次训练中的神经元数量,从而防止模型过度依赖于某些神经元。网络会学会更加鲁棒的特征。

  2. 训练时随机丢弃:在训练过程中,丢弃层会根据给定的概率随机丢弃一些神经元。在丢弃时,剩余神经元的值会被适当缩放,以保持总输入的期望值不变。

  3. 测试时不丢弃:在推理(测试)阶段,丢弃层不会丢弃任何神经元的输出,所有的神经元都会参与计算。

扩展功能

  1. C/C++ 代码生成:通过 MATLAB® Coder™,你可以将丢弃层的操作生成 C 或 C++ 代码。

  2. GPU 代码生成:使用 GPU Coder™,可以为 NVIDIA® GPU 生成 CUDA® 代码,从而加速深度学习模型的推理过程。

版本历史

  • R2016a:丢弃层在 MATLAB 中首次推出,成为深度学习模型中常见的正则化技术之一。

参考

  1. Srivastava, Nitish, et al. “Dropout: A Simple Way to Prevent Neural Networks from Overfitting.” The Journal of Machine Learning Research 15.1 (2014): 1929-1958.
  2. Krizhevsky, Alex, et al. “ImageNet Classification with Deep Convolutional Neural Networks.” Communications of the ACM 60.6 (2017): 84-90.

总结

dropoutLayer 是一种常见的正则化层,通过随机丢弃输入的部分元素,帮助减少神经网络的过拟合。它在训练过程中改变了网络的结构,使得每次训练时的网络有所不同。通过适当的丢弃概率,可以提高模型的泛化能力。

spatialDropoutLayer — 空间丢弃层

空间丢弃层(Spatial Dropout Layer)是丢弃层的一个变体。与标准丢弃层不同,它会在训练过程中随机丢弃整个输入通道,而不是丢弃单个元素。这种操作能够有效地防止神经网络的过拟合,尤其是在处理图像或其他多通道数据时。通过丢弃整个通道,网络学会依赖多个特征,而不是单一特征,从而增强了模型的泛化能力。

创建 spatialDropoutLayer

你可以使用以下语法来创建一个空间丢弃层:

layer = spatialDropoutLayer

或者,创建一个具有指定丢弃概率的空间丢弃层:

layer = spatialDropoutLayer(Probability=0.25)

还可以指定层的名称:

layer = spatialDropoutLayer(Name="spat1", Probability=0.25)

其中,Probability 是丢弃通道的概率,通常设为小于 1 的非负数。

主要属性

  1. Probability:丢弃输入通道的概率。默认值为 0.5,表示每次训练时随机丢弃一半的通道。

    • 类型:double
    • 示例:如果你设置 Probability = 0.4,那么每次训练时大约会丢弃 40% 的通道。
  2. Name:层的名称。默认值为空字符串 ""。你可以为空间丢弃层指定名称,例如 'spat1'

    • 类型:charstring
  3. NumInputs:层的输入数量,默认为 1,表示空间丢弃层只接受一个输入。

    • 类型:double
  4. InputNames:输入的名称,默认为 {'in'},表示空间丢弃层只接受一个输入。

    • 类型:cell
  5. NumOutputs:输出的数量,默认为 1,表示空间丢弃层只有一个输出。

    • 类型:double
  6. OutputNames:输出的名称,默认为 {'out'},表示空间丢弃层只有一个输出。

    • 类型:cell

示例:如何使用 spatialDropoutLayer

% 创建一个空间丢弃层并设置丢弃概率为 0.25
layer = spatialDropoutLayer(Name="spat_drop1", Probability=0.25);

% 在层数组中包含空间丢弃层
layers = [
    imageInputLayer([28 28 1])           % 输入层
    convolution2dLayer(5, 20)            % 卷积层
    reluLayer                            % ReLU 激活层
    spatialDropoutLayer(Probability=0.4)  % 空间丢弃层,丢弃概率为 40%
    fullyConnectedLayer(10)              % 全连接层
    softmaxLayer                         % Softmax 层
];

在这个例子中,空间丢弃层被用在了卷积层和全连接层之间。每次训练时,这一层会随机丢弃 40% 的通道。

作用和原理

  1. 防止过拟合:空间丢弃层通过丢弃整个通道,减少了每次训练中的神经元数量,从而防止模型过度依赖于某些特定通道。这能够有效地提高网络的泛化能力。

  2. 训练时丢弃通道:在训练过程中,空间丢弃层会随机丢弃输入的部分通道。在丢弃通道时,剩余通道的值会被适当缩放,以保持总输入的期望值不变。

  3. 预测时不丢弃:在推理(测试)阶段,空间丢弃层不会丢弃任何通道的输出,所有的通道都会参与计算。

扩展功能

  1. C/C++ 代码生成:通过 MATLAB® Coder™,你可以将空间丢弃层的操作生成 C 或 C++ 代码。

  2. GPU 代码生成:使用 GPU Coder™,可以为 NVIDIA® GPU 生成 CUDA® 代码,从而加速深度学习模型的推理过程。

版本历史

  • R2024a:空间丢弃层首次推出,作为丢弃层的改进版本,特别适用于多通道数据,如图像数据。

参考

  1. Jonathan Tompson, Ross Goroshin, Arjun Jain, Yann LeCun, and Christoph Bregler. “Efficient Object Localization Using Convolution Networks.” arXiv preprint arXiv:1411.4280v3 (2015).

总结

spatialDropoutLayer 是一种改进的丢弃层,专门用于处理多通道数据。它通过丢弃整个输入通道,而不是单个元素,帮助网络学习更加鲁棒的特征,并减少过拟合的风险。它特别适用于图像和其他具有多个通道的数据,能够有效地增强网络的泛化能力。

additionLayer — 相加层

additionLayer 是一种在神经网络中按元素将多个输入相加的层。它可以用于将来自多个路径的特征图(feature maps)结合在一起。每个输入必须具有相同的维度。相加层的作用通常用于残差网络(ResNet)或其他需要在层之间进行特征融合的网络架构中。

创建 additionLayer

  1. 基础语法:

    layer = additionLayer(numInputs)
    

    这个命令会创建一个相加层,该层能够处理 numInputs 个输入,并按元素将它们相加。

  2. 指定层名称:

    layer = additionLayer(numInputs, 'Name', name)
    

    在这种情况下,你可以为相加层指定一个名称。name 是你为该层指定的名称,帮助在网络中识别该层。

主要属性

  1. NumInputs:输入的数量。

    • 类型:double
    • 描述:这是一个正整数,指定相加层可以接收的输入数目。输入数目必须大于或等于 2。
  2. Name:层的名称。

    • 类型:charstring
    • 描述:层的名称,默认为空字符串 ""。你可以通过指定此属性为自定义名称来标识层。
  3. InputNames:输入的名称。

    • 类型:cell
    • 描述:此属性表示输入层的名称。默认情况下,输入名称为 {'in1', 'in2', ..., 'inN'},其中 N 为输入的数量。
  4. NumOutputs:输出的数量。

    • 类型:double
    • 描述:此属性为只读,始终为 1,因为相加层只有一个输出。
  5. OutputNames:输出名称。

    • 类型:cell
    • 描述:此属性为只读,默认为 {'out'},表示相加层的输出名称。

示例:如何使用 additionLayer

创建并连接 additionLayer
% 创建一个包含两个输入的相加层
layer = additionLayer(2, 'Name', 'add');

% 创建一个神经网络
net = dlnetwork;

% 向网络中添加相加层
net = addLayers(net, layer);

% 创建两个 ReLU 层
layer1 = reluLayer('Name', 'relu1');
layer2 = reluLayer('Name', 'relu2');

% 将 ReLU 层连接到相加层的输入
net = addLayers(net, layer1);
net = connectLayers(net, 'relu1', 'add/in1');

net = addLayers(net, layer2);
net = connectLayers(net, 'relu2', 'add/in2');

% 可视化更新后的网络
plot(net);

在这个示例中,我们创建了一个包含两个输入的相加层,并连接了两个 ReLU 层。这两个 ReLU 层的输出会在相加层处被按元素相加。最后,通过 plot 函数可视化更新后的神经网络。

作用和原理

  1. 按元素相加:相加层会按元素将多个输入相加。所有输入的维度必须相同,网络会对输入进行逐元素求和。

  2. 常用于残差网络:相加层通常用于残差网络(ResNet)架构中,这种网络结构将前一层的输出与当前层的输出进行相加,允许信息在网络中更深层次地传播,避免梯度消失问题。

层输入和输出格式

相加层支持多种数据格式,例如:

  • “CB”(通道,批量)
  • “SCB”(空间,通道,批量)
  • “SSCB”(空间,空间,通道,批量)

相加层在网络中传递数据时,确保输入格式和输出格式的兼容性。

扩展功能

  • C/C++ 代码生成:你可以使用 MATLAB® Coder™ 生成相加层的 C 或 C++ 代码。
  • GPU 代码生成:使用 GPU Coder™ 生成 CUDA® 代码,为 NVIDIA® GPU 提供支持。

版本历史

  • R2017b:首次引入 additionLayer

总结

additionLayer 是一个用于按元素将多个输入相加的层。它在构建深度神经网络时非常有用,尤其是在需要将不同路径的输出组合起来时,如残差网络中的跳跃连接。通过使用 additionLayer,网络能够更有效地学习并改善训练过程中的梯度传播。

Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐