使用matlab构建深度神经网络:layerGraph、dlnetwork、addLayers、removeLayers、replaceLayer、connectLayers、disconnectLa

layerGraph 是 MATLAB 中用于构建、操作和可视化神经网络层结构的工具。它以图的形式表示深度学习网络,其中每个节点代表一个网络层,边则表示层之间的连接。layerGraph 主要用于设计具有多个输入和多个输出的网络,并支持层之间的复杂连接模式。

然而,从 R2024a 开始,layerGraph 对象已不再推荐使用,建议改用 dlnetwork 对象。尽管如此,layerGraph 仍然是一个非常有用的工具,尤其是在网络设计和层间连接时。

layerGraph 对象的主要特性

  1. 表示网络结构layerGraph 对象将神经网络架构表示为有向无环图(DAG),每个节点(层)通过边(连接)与其他节点相连。它使得层之间的复杂连接结构变得更加直观和易于操作。

  2. 支持多个输入和输出:与常见的网络设计不同,layerGraph 允许您创建具有多个输入和多个输出的复杂网络架构。

  3. 层连接管理:您可以通过 connectLayersdisconnectLayers 等函数,灵活地连接和断开层之间的连接。这对于设计不同类型的网络结构(如残差网络、跳跃连接等)非常有用。

layerGraph 的常见操作

1. 创建 layerGraph 对象

您可以通过几种不同的方式创建 layerGraph 对象:

  • 空的 layerGraph 对象

    lgraph = layerGraph;
    

    这会创建一个空的层图对象,您可以逐步向其中添加层。

  • 基于层数组创建 layerGraph

    layers = [
        imageInputLayer([28 28 1])
        convolution2dLayer(3,16)
        batchNormalizationLayer
        reluLayer
        fullyConnectedLayer(10)
        softmaxLayer
        classificationLayer
    ];
    lgraph = layerGraph(layers);
    

    这样,您就根据一个层数组创建了一个完整的网络架构。

  • 从已存在的网络创建 layerGraph

    lgraph = layerGraph(pretrainedNet);
    

    如果您已经有一个训练好的网络(如 SeriesNetworkDAGNetwork),可以从它中提取 layerGraph 对象。

2. 添加层

您可以使用 addLayers 函数向现有的 layerGraph 对象中添加新层:

newLayer = fullyConnectedLayer(100, 'Name', 'fc_new');
lgraph = addLayers(lgraph, newLayer);
3. 连接层

您可以使用 connectLayers 函数来连接层。在连接层时,您需要指定源层和目标层,或源层的输出名称和目标层的输入名称。

lgraph = connectLayers(lgraph, 'conv_1', 'fc_new');
4. 断开层连接

使用 disconnectLayers 函数可以断开两层之间的连接:

lgraph = disconnectLayers(lgraph, 'conv_1', 'fc_new');
5. 替换层

您可以通过 replaceLayer 函数替换层。例如,您可以用一个新的卷积层替换一个现有的卷积层。

newConvLayer = convolution2dLayer(5, 32, 'Padding', 'same');
lgraph = replaceLayer(lgraph, 'conv_1', newConvLayer);
6. 绘制网络图

您可以通过 plot 函数将 layerGraph 可视化,这样可以直观地查看网络的层次结构和层之间的连接关系。

plot(lgraph);
7. 网络连接示例:残差连接

一个常见的使用 layerGraph 的场景是构建具有残差连接的网络。残差连接可以有效地解决梯度消失和爆炸问题,尤其在深层网络中。以下是如何使用 layerGraph 创建一个带有残差连接的网络:

layers = [
    imageInputLayer([28 28 1])
    convolution2dLayer(3, 16, 'Padding', 'same')
    batchNormalizationLayer
    reluLayer
    convolution2dLayer(3, 16, 'Padding', 'same')
    batchNormalizationLayer
    reluLayer
    additionLayer(2, 'Name', 'add')
    fullyConnectedLayer(10)
    softmaxLayer
    classificationLayer
];

lgraph = layerGraph(layers);

% 添加跳跃连接
lgraph = connectLayers(lgraph, 'relu_1', 'add/in1');
lgraph = connectLayers(lgraph, 'relu_3', 'add/in2');

% 绘制层图
figure;
plot(lgraph);
8. 使用 dlnetwork 进行训练

layerGraph 对象允许您设计网络架构,而 dlnetwork 对象则用于实现自定义训练循环。可以使用 dlnetwork 将网络图转换为一个可训练的网络,并执行训练。

net = dlnetwork(lgraph);

layerGraphdlnetwork 对比

尽管 layerGraph 对象功能丰富,但 MATLAB 推荐使用 dlnetwork 对象,因为它提供了更高效的训练和推理功能,支持自定义训练循环、支持更多网络架构以及优化的计算性能。以下是两者的对比:

操作layerGraphdlnetwork
网络构建通过层数组或已存在的网络创建层图通过层数组或现有的网络对象创建
图形可视化使用 plot 函数可视化层连接使用 plot 可视化网络结构
自定义训练循环不支持直接自定义训练循环完全支持自定义训练循环
支持的网络架构适用于较简单的架构支持更复杂的网络架构,如动态图、LSTM等
训练和推理性能适用于小型模型针对大规模数据和复杂任务优化
量化支持不支持量化支持量化和训练时量化

总结

layerGraph 是一个非常有用的工具,可以帮助用户设计和操作深度学习网络的层级结构,特别适用于构建复杂的、具有多个输入输出的网络。它提供了丰富的功能,如添加层、连接层、替换层以及绘制网络架构。然而,MATLAB 已不推荐使用 layerGraph,而是推荐使用更为强大的 dlnetwork 对象,后者支持更多类型的网络架构、更高效的训练和推理过程。

dlnetwork 对象简介

dlnetwork 是 MATLAB 中的一个深度学习网络对象,用于指定神经网络的架构。它允许创建、训练和预测深度神经网络,并支持多种自定义功能。与传统的 LayerGraph 对象不同,dlnetwork 对象通过直接操作层的属性和连接提供更高的灵活性,并且不再依赖于图形化表示。自 MATLAB R2024a 起,推荐使用 dlnetwork 来替代 LayerGraph

dlnetwork 对象的创建和用法

1. 创建 dlnetwork 对象

您可以通过以下几种方式创建 dlnetwork 对象:

  • 创建空的 dlnetwork 对象

    net = dlnetwork;
    

    这会创建一个没有任何层的空网络,适合从头开始构建网络。

  • 根据层数组创建网络

    layers = [
        imageInputLayer([28 28 1])
        convolution2dLayer(5,16,Padding='same')
        batchNormalizationLayer
        reluLayer
        fullyConnectedLayer(10)
        softmaxLayer
        classificationLayer
    ];
    net = dlnetwork(layers);
    

    使用层数组创建一个完整的网络,并自动初始化学习参数。

  • 使用输入数据初始化

    X = rand(28,28,1,100);  % 示例输入数据
    net = dlnetwork(layers, X);
    

    通过示例输入数据(X)来初始化网络,自动计算学习参数的大小。

  • 初始化标志

    net = dlnetwork(layers, Initialize=false);
    

    创建一个空的网络,但不初始化学习参数,可以在后续阶段进行手动初始化。

2. dlnetwork 属性

dlnetwork 对象有多个重要属性,用于存储和管理网络的各个方面:

  • Layers:存储网络的层,类型为 Layer 数组。
  • Connections:存储层之间的连接,类型为表格,包含源层和目标层的对应关系。
  • Learnables:网络的学习参数,包括卷积核权重、全连接层权重等。
  • State:网络的状态参数,存储在表格中,包括用于保持中间状态的参数(例如 LSTM 层的隐藏状态和细胞状态)。
  • InputNames:网络输入的名称,用于定义多个输入的顺序。
  • OutputNames:网络输出的名称,用于定义多个输出的顺序。
  • Initialized:指示网络是否已初始化,初始化为 1 (true) 时,网络可以用于训练和推理。
3. 常见方法和函数
  • addLayers:向网络中添加新的层。

    newLayer = convolution2dLayer(3, 64);
    net = addLayers(net, newLayer);
    
  • connectLayers:连接两层之间的连接。

    net = connectLayers(net, 'conv1', 'conv2');
    
  • removeLayers:从网络中移除某些层。

    net = removeLayers(net, 'conv2');
    
  • initialize:初始化网络的学习参数。

    net = initialize(net);
    
  • predict:用于推理和预测,通过前向传播计算网络的输出。

    Y = predict(net, X);
    
  • forward:用于训练时的前向传播。

    Y = forward(net, X);
    
  • resetState:重置网络中的状态参数(例如 LSTM 层的状态)。

    net = resetState(net);
    
4. 自定义训练循环和优化

dlnetwork 支持自定义训练循环,可以通过 dlgradientdlfeval 进行自动微分和损失计算。以下是一个基本的自定义训练循环示例:

% 训练数据
XTrain = rand(28,28,1,100);
YTrain = rand(10, 100);

% 自定义训练循环
for epoch = 1:numEpochs
    for i = 1:numMiniBatch
        % 获取当前小批量数据
        XBatch = XTrain(:,:,:,i);
        YBatch = YTrain(:,i);
        
        % 计算预测
        [Y, gradients] = dlfeval(@modelGradients, net, XBatch, YBatch);
        
        % 更新参数
        net = sgdmupdate(net, gradients);
    end
end
5. 复杂的神经网络设计

您可以创建复杂的多输入多输出网络,包含残差连接、并行路径等。

% 定义简单的网络层
layers = [
    imageInputLayer([28 28 1])
    convolution2dLayer(5, 16)
    batchNormalizationLayer
    reluLayer
    convolution2dLayer(3, 32)
    fullyConnectedLayer(10)
    softmaxLayer
];

% 创建网络
net = dlnetwork(layers);

% 添加并行路径
parallelLayer = [
    convolution2dLayer(1, 64)
    batchNormalizationLayer
    reluLayer
];
net = addLayers(net, parallelLayer);
net = connectLayers(net, 'relu_1', 'parallelConv');
6. 示例:构建神经网络

创建一个神经网络并添加多个分支:

% 定义输入层
layers = [
    imageInputLayer([28 28 1], Normalization="none")

    convolution2dLayer(5, 16, Padding="same")
    batchNormalizationLayer
    reluLayer

    convolution2dLayer(3, 32, Padding="same", Stride=2)
    batchNormalizationLayer
    reluLayer
    convolution2dLayer(3, 32, Padding="same")
    batchNormalizationLayer
    reluLayer

    additionLayer(2, Name="add")

    fullyConnectedLayer(10)
    softmaxLayer(Name="softmax")];

net = dlnetwork(layers);

% 添加并行路径
parallelLayers = [
    convolution2dLayer(1, 32, Stride=2, Name="conv_skip")
    batchNormalizationLayer
    reluLayer(Name="relu_skip")];

net = addLayers(net, parallelLayers);
net = connectLayers(net, "relu_1", "conv_skip");
net = connectLayers(net, "relu_skip", "add/in2");

% 可视化网络
figure
plot(net)

dlnetworkLayerGraph 对比

特性dlnetworkLayerGraph
灵活性高,适用于复杂架构和自定义训练循环灵活性较低,适用于简单的网络设计和可视化
支持的网络架构支持更多复杂架构,如并行路径、LSTM、GAN 等主要用于简单的序列式网络,复杂架构较为困难
自定义训练循环完全支持自定义训练循环不支持自定义训练循环
层级图表示不依赖图形化表示,直接操作网络层属性提供图形化层图显示和层之间的连接
性能优化支持 GPU 加速和高效的自定义优化流程无 GPU 加速支持,主要依赖于传统训练流程

总结

dlnetwork 是 MATLAB 中用于表示和操作深度学习网络的核心对象,支持从零开始构建网络、进行自定义训练和优化循环、实现复杂网络结构等。它为深度学习任务提供了高度的灵活性,特别适合需要自定义功能和优化的应用场景。

addLayers 函数简介

addLayers 是 MATLAB 中用于向神经网络(尤其是 dlnetwork 对象)添加层的函数。通过使用该函数,您可以在已存在的网络中添加新的层。层被按顺序连接,并且它们的层名称必须唯一,不能与现有网络中的层名称重复。

函数语法

netUpdated = addLayers(net, layers)
  • net:当前的 dlnetwork 对象,包含已有的网络架构。
  • layers:一个 Layer 数组,包含要添加到网络中的新层。
  • netUpdated:更新后的 dlnetwork 对象,包含原始网络的所有层以及添加的层。

功能描述

addLayers 函数用于将一组新的网络层按顺序添加到现有的神经网络中。该函数确保新添加的层的名称唯一,并与现有网络层连接。添加的层不会改变现有网络中的任何层或连接,新的网络对象是原网络的更新版本。

示例

示例 1: 创建并扩展简单神经网络
  1. 创建一个空的 dlnetwork 对象并添加层:
net = dlnetwork;

layers = [
    imageInputLayer([32 32 3])  
    convolution2dLayer(3,16,Padding="same")
    batchNormalizationLayer
    reluLayer];

net = addLayers(net, layers);
  1. 绘制网络架构:
figure
plot(net)
示例 2: 从头开始构建双输出神经网络
  1. 定义网络架构并添加不同的层:
numClasses = 10;
numResponses = 1;

net = dlnetwork;

layers = [
    imageInputLayer([28 28 1],Normalization="none")
    convolution2dLayer(5,16,Padding="same")
    batchNormalizationLayer
    reluLayer(Name="relu_1")
    convolution2dLayer(3,32,Padding="same",Stride=2)
    batchNormalizationLayer
    reluLayer
    convolution2dLayer(3,32,Padding="same")
    batchNormalizationLayer
    reluLayer
    additionLayer(2,Name="add")
    fullyConnectedLayer(numClasses)
    softmaxLayer(Name="softmax")];

net = addLayers(net, layers);
  1. 添加跳过连接(skip connection):
layers = [
    convolution2dLayer(1,32,Stride=2,Name="conv_skip")
    batchNormalizationLayer
    reluLayer(Name="relu_skip")];

net = addLayers(net, layers);
net = connectLayers(net, "relu_1", "conv_skip");
net = connectLayers(net, "relu_skip", "add/in2");
  1. 添加回归输出层:
layers = fullyConnectedLayer(numResponses, Name="fc_2");
net = addLayers(net, layers);
net = connectLayers(net, "add", "fc_2");
  1. 绘制完整的网络架构:
figure
plot(net)

重要注意事项

  • 层名称唯一性:添加的层必须具有唯一的名称。如果 layers 中的层名称与现有网络中的层名称冲突,addLayers 会抛出错误。
  • 初始化addLayers 不会自动初始化网络的学习参数。如果需要初始化学习参数,可以使用 initialize 函数。
  • 量化信息addLayers 不会保留量化信息。如果输入网络是量化网络,输出网络不会包含量化信息。

版本历史记录

  • R2024a:推荐使用 dlnetwork 对象,不推荐使用 LayerGraph 对象。addLayers 函数可以在 dlnetwork 上使用,允许灵活地扩展网络结构。

相关函数

  • removeLayers:从网络中移除指定的层。
  • replaceLayer:替换网络中的指定层。
  • connectLayers:连接网络中的层。
  • disconnectLayers:断开网络中的层连接。
  • plot:可视化神经网络架构。

总结

addLayers 函数是 MATLAB 中用于灵活构建和扩展深度神经网络的重要工具,允许您在已有网络基础上添加新层,同时保留网络的原有架构和功能。

removeLayers 函数简介

removeLayers 函数用于从一个 dlnetwork 对象中删除指定的层及其连接。删除层后,网络的结构将更新,删除的层及其与其他层的连接也将被移除。

函数语法

netUpdated = removeLayers(net, layerNames)
  • net:当前的 dlnetwork 对象,包含已定义的网络架构。
  • layerNames:指定要删除的层的名称,可以是一个字符向量、字符串数组或字符向量元胞数组。
  • netUpdated:返回更新后的 dlnetwork 对象,其中移除了指定的层及其连接。

功能描述

removeLayers 函数从给定的神经网络中删除指定名称的层,并且移除与这些层相关的连接。删除层后,返回一个更新的神经网络对象。删除的层不会影响其他层和网络结构。

示例

示例 1: 创建并移除神经网络的层
  1. 创建一个简单的神经网络,并添加一些层:
net = dlnetwork;

layers = [
    imageInputLayer([28 28 1])  
    convolution2dLayer(3,16,Padding="same")
    batchNormalizationLayer
    reluLayer];

net = addLayers(net, layers);

figure
plot(net)  % 绘制网络图
  1. 移除 batchNormalizationLayer 层及其连接:
net = removeLayers(net, "batchNormalizationLayer");
figure
plot(net)  % 绘制更新后的网络图
示例 2: 删除多个层
  1. 假设我们有多个层,并想要删除其中的两个层:
net = dlnetwork;

layers = [
    imageInputLayer([28 28 1])  
    convolution2dLayer(3,16,Padding="same")
    batchNormalizationLayer
    reluLayer];

net = addLayers(net, layers);

% 删除 'batchNormalizationLayer' 和 'reluLayer'
net = removeLayers(net, {"batchNormalizationLayer", "reluLayer"});
figure
plot(net)  % 绘制删除后的网络图

输入参数

  • net:当前的 dlnetwork 对象,指定了当前的神经网络架构。
  • layerNames:一个字符向量、字符串数组或字符向量元胞数组,指定要删除的层的名称。如果要删除多个层,可以将它们的名称以数组或元胞数组的形式传递。

输出参数

  • netUpdated:删除指定层后的更新网络,返回一个未初始化的 dlnetwork 对象。要初始化网络中的学习参数,可以使用 initialize 函数。

注意事项

  • 量化信息removeLayers 不会保留量化信息。如果输入网络是量化网络,输出网络将不包含量化信息。
  • 未初始化的网络:该函数返回的是未初始化的网络,如果需要进行预测或训练,必须调用 initialize 函数进行初始化。
  • 层名称唯一性:确保删除的层名称在网络中是唯一的,并且层名称在网络中已经存在。

相关函数

  • addLayers:向神经网络中添加新层。
  • replaceLayer:替换神经网络中的层。
  • connectLayers:在神经网络中连接层。
  • disconnectLayers:断开神经网络中的层连接。
  • plot:可视化神经网络架构。

总结

removeLayers 函数是一个用于在 dlnetwork 对象中删除指定层及其连接的工具,它有助于动态地修改神经网络架构,适应不同的需求。在神经网络中删除不再需要的层时,记得使用该函数来更新网络结构。

replaceLayer 函数简介

replaceLayer 函数用于替换 dlnetwork 对象中的指定层。通过此函数,你可以用新的层替换现有网络中的某一层,并根据需要重新连接层。

函数语法

netUpdated = replaceLayer(net, layerName, layers)
netUpdated = replaceLayer(net, layerPath, layers)
netUpdated = replaceLayer(___, ReconnectBy=mode)
  • net:当前的 dlnetwork 对象。
  • layerNamelayerPath:要替换的层的名称或路径。
    • layerName:用于直接指定网络中要替换的层名称。
    • layerPath:指定嵌套层的路径(适用于嵌套在 networkLayer 或自定义层的 dlnetwork 中的层)。
  • layers:新的网络层,可以是一个 Layer 数组,定义了替代层的结构。
  • mode:指定如何重新连接层的方式。可以选择:
    • "name":通过输入和输出的名称重新连接层。
    • "order":根据层的输入输出顺序重新连接层。

功能描述

replaceLayer 函数用于替换指定层并重新连接新的层到网络中。此功能特别适用于修改已有网络架构(例如替换激活层或添加新的正则化层)。此函数同时提供了两种方法来重新连接层——基于名称或基于层的顺序。

示例

示例 1: 替换简单网络中的层
  1. 定义一个简单的神经网络并绘制其图形:
net = dlnetwork;

layers = [
    imageInputLayer([28 28 1], Name="input")
    convolution2dLayer(3, 16, Padding="same")
    reluLayer(Name="relu1")
    additionLayer(2, Name="add")
    fullyConnectedLayer(10)
    softmaxLayer
];

net = addLayers(net, layers);
net = connectLayers(net, "input", "add/in2");

figure
plot(net)
  1. 使用 replaceLayer 函数将 relu1 层替换为一个批量归一化层后接一个 Leaky ReLU 层:
layers = [
    batchNormalizationLayer
    leakyReluLayer(0.1)
];

net = replaceLayer(net, "relu1", layers);
figure
plot(net)
示例 2: 替换嵌套网络中的层
  1. 定义一个包含嵌套层的网络,并绘制网络图:
net = dlnetwork;

layers = [
    lstmLayer(100, OutputMode="sequence")
    dropoutLayer(0.2)
];

lstmDropoutLayer = networkLayer(layers);

layers = [
    sequenceInputLayer(3)
    lstmDropoutLayer
    lstmDropoutLayer
    fullyConnectedLayer(10)
    softmaxLayer
];

net = addLayers(net, layers);
figure
plot(net)
  1. 查找并修改第一个 LSTM 层,然后替换它:
tempLSTMLayer = getLayer(net, "subnet_1/lstm");
tempLSTMLayer.InputWeightsInitializer = "zeros";
tempLSTMLayer.RecurrentWeightsInitializer = "zeros";
tempLSTMLayer.BiasInitializer = "ones";
tempLSTMLayer.Name = "modifiedLSTM";

net = replaceLayer(net, "subnet_1/lstm", tempLSTMLayer);

输入参数

  • netdlnetwork 对象,表示当前的神经网络。
  • layerName:要替换的层名称,可以是字符向量或字符串标量。
  • layerPath:嵌套层的路径,适用于网络层中嵌套的层,使用层路径的形式,例如 "networkLayerName/layerName"
  • layers:新的层,定义了要替换成的新层。
  • mode:指定层如何重新连接,选择 "name"(通过名称连接)或 "order"(通过顺序连接)。

输出参数

  • netUpdated:返回更新后的 dlnetwork 对象,新的层已经替换旧的层。返回的网络是未初始化的,需使用 initialize 函数初始化学习参数。

注意事项

  • replaceLayer 函数不会保留量化信息。如果输入网络是量化网络,输出的网络将不包含量化信息。
  • 使用 replaceLayer 后,网络仍然是未初始化的,因此你需要手动调用 initialize 函数进行初始化。
  • 对于嵌套层的替换,确保提供正确的层路径。

相关函数

  • addLayers:向网络中添加新层。
  • removeLayers:从网络中移除层。
  • connectLayers:在网络中连接层。
  • disconnectLayers:在网络中断开层连接。
  • plot:可视化网络架构。

总结

replaceLayer 函数非常适合在已有的神经网络中进行架构调整,例如替换某个层,修改某个网络模块,或进行特定的改进。它提供了灵活的层替换和重新连接方式,帮助你高效地修改深度学习模型。

connectLayers 函数简介

connectLayers 函数用于在 dlnetwork 对象中连接源层和目标层。这是深度学习模型构建中必不可少的操作,它帮助您通过指定层的输入和输出名称来连接不同的层。

函数语法

netUpdated = connectLayers(net, s, d)
  • net:当前的 dlnetwork 对象。
  • s:连接的源层,指定为字符向量或字符串标量。如果源层有多个输出,则使用 "layerName/outputName" 这样的格式。
  • d:连接的目标层,指定为字符向量或字符串标量。如果目标层有多个输入,则使用 "layerName/inputName" 这样的格式。

功能描述

connectLayers 用于将源层的输出与目标层的输入连接起来。这个功能是构建深度神经网络时必不可少的,因为它帮助您定义不同层之间的数据流向。

示例

示例 1: 创建并连接相加层
net = dlnetwork;

% 创建相加层,指定该层有两个输入
layer = additionLayer(2, 'Name', 'add');
net = addLayers(net, layer);

% 向网络中添加两个 ReLU 层,并连接到相加层
layer = reluLayer('Name', 'relu1');
net = addLayers(net, layer);
net = connectLayers(net, 'relu1', 'add/in1');

layer = reluLayer('Name', 'relu2');
net = addLayers(net, layer);
net = connectLayers(net, 'relu2', 'add/in2');

% 可视化更新后的网络
figure;
plot(net);
示例 2: 定义双输出神经网络并连接跳过连接
numClasses = 10;
numResponses = 1;

net = dlnetwork;

% 定义主分支的网络层
layers = [
    imageInputLayer([28 28 1], Normalization="none")
    convolution2dLayer(5, 16, Padding="same")
    batchNormalizationLayer
    reluLayer(Name="relu_1")
    convolution2dLayer(3, 32, Padding="same", Stride=2)
    batchNormalizationLayer
    reluLayer
    convolution2dLayer(3, 32, Padding="same")
    batchNormalizationLayer
    reluLayer
    additionLayer(2, Name="add")
    fullyConnectedLayer(numClasses)
    softmaxLayer(Name="softmax")
];

net = addLayers(net, layers);

% 添加跳过连接
layers = [
    convolution2dLayer(1, 32, Stride=2, Name="conv_skip")
    batchNormalizationLayer
    reluLayer(Name="relu_skip")
];

net = addLayers(net, layers);
net = connectLayers(net, "relu_1", "conv_skip");
net = connectLayers(net, "relu_skip", "add/in2");

% 添加回归输出层
layers = fullyConnectedLayer(numResponses, Name="fc_2");
net = addLayers(net, layers);
net = connectLayers(net, "add", "fc_2");

% 可视化网络
figure;
plot(net);

输入参数

  • netdlnetwork 对象,表示当前的神经网络。
  • s:源层,指定为字符向量或字符串标量。若源层有多个输出,使用 "layerName/outputName" 的格式。
  • d:目标层,指定为字符向量或字符串标量。若目标层有多个输入,使用 "layerName/inputName" 的格式。

输出参数

  • netUpdated:返回更新后的 dlnetwork 对象,包含了源层和目标层的连接。返回的网络是未初始化的,需要使用 initialize 函数初始化网络的学习参数。

注意事项

  • connectLayers 函数不会保留量化信息。如果输入网络是量化网络,则输出的网络将不包含量化信息。
  • 连接层时,要确保源层的输出名称与目标层的输入名称匹配。

相关函数

  • addLayers:向网络中添加新层。
  • removeLayers:从网络中移除层。
  • replaceLayer:替换网络中的层。
  • disconnectLayers:断开网络中两层的连接。
  • plot:可视化神经网络架构。

总结

connectLayers 是深度学习网络构建中的关键函数,它允许你通过层的输入和输出名称来连接不同的网络层。通过该函数,你可以精确地控制网络的结构,连接不同的层以实现更复杂的模型架构。

disconnectLayers 函数简介

disconnectLayers 函数用于从 dlnetwork 对象中断开两层之间的连接。此操作从当前网络中移除了指定源层和目标层之间的连接,但保留网络中其他的层和连接。它有助于在神经网络设计中修改和调整层的连接结构。

函数语法

netUpdated = disconnectLayers(net, s, d)
  • net:当前的 dlnetwork 对象,表示神经网络。
  • s:源层,指定为字符向量或字符串标量。如果源层有多个输出,使用 "layerName/outputName" 的格式。
  • d:目标层,指定为字符向量或字符串标量。如果目标层有多个输入,使用 "layerName/inputName" 的格式。

功能描述

disconnectLayers 用于断开源层和目标层之间的连接,返回一个更新后的 dlnetwork 对象。源层和目标层仍然保留在网络中,但它们之间的连接被移除。此功能可以帮助用户在构建神经网络时,调整连接结构或执行其他层级操作。

示例

示例 1: 断开层连接
% 创建一个空的神经网络
net = dlnetwork;

% 定义层并添加到网络中
layers = [
    imageInputLayer([28 28 1])  
    convolution2dLayer(3,16,Padding="same")
    batchNormalizationLayer
    reluLayer
];

net = addLayers(net, layers);
figure
plot(net)  % 绘制原始网络

% 断开 'conv' 层和 'batchnorm' 层之间的连接
net = disconnectLayers(net, "conv", "batchnorm");

% 绘制更新后的网络
figure
plot(net)

在这个例子中,网络中连接了 conv 层和 batchnorm 层,使用 disconnectLayers 后,这两层之间的连接被移除。

输入参数

  • netdlnetwork 对象,表示当前的神经网络。
  • s:源层,指定为字符向量或字符串标量。如果源层有多个输出,使用 "layerName/outputName" 的格式。
  • d:目标层,指定为字符向量或字符串标量。如果目标层有多个输入,使用 "layerName/inputName" 的格式。

输出参数

  • netUpdated:返回更新后的 dlnetwork 对象,其中不再包含源层与目标层之间的连接。

注意事项

  • disconnectLayers 不会保留量化信息。如果输入网络是量化网络,输出网络将不包含量化信息。
  • 该函数只断开指定的源层和目标层之间的连接,其他层的结构和连接不会受到影响。

相关函数

  • addLayers:向网络中添加新层。
  • removeLayers:从网络中移除层。
  • replaceLayer:替换网络中的层。
  • connectLayers:将源层和目标层连接。
  • plot:可视化神经网络架构。

总结

disconnectLayers 是用于修改神经网络层连接的函数,它帮助您从网络中断开指定层之间的连接。这对于网络设计中的修改和调试非常有用,可以帮助您灵活调整网络结构。

plot 函数简介

plot 函数用于可视化神经网络架构,显示网络中的各层及它们之间的连接。这对于理解和分析神经网络结构非常有用,尤其是在调试和优化网络时。

函数语法

plot(net)
  • net:一个 dlnetwork 对象,表示深度神经网络。

功能描述

plot 函数绘制神经网络的图形表示,展示网络的各层及它们之间的连接。这个图形可以帮助用户更直观地理解网络架构,特别是在复杂的网络中。

示例

示例 1: 绘制简单神经网络
% 创建一个空的神经网络
net = dlnetwork;

% 定义网络层
layers = [
    imageInputLayer([32 32 3])  % 输入层,大小为32x32x3的图像
    convolution2dLayer(3,16,Padding="same")  % 卷积层
    batchNormalizationLayer  % 批归一化层
    reluLayer(Name="relu1")  % ReLU 激活层
    
    convolution2dLayer(3,16,Padding="same",Stride=2)  % 卷积层
    batchNormalizationLayer  % 批归一化层
    reluLayer  % ReLU 激活层
    additionLayer(2,Name="add")  % 相加层
];

% 将层添加到网络中
net = addLayers(net, layers);

% 连接 layers
net = connectLayers(net, "relu1", "add/in2");

% 绘制网络
figure
plot(net)

此代码创建了一个简单的神经网络,包含输入层、卷积层、批归一化层、ReLU 激活层和相加层。使用 plot 函数可视化该网络的结构。

输入参数

  • netdlnetwork 对象,表示神经网络。

注意事项

  • plot 仅用于绘制层和连接的图形,适用于较小规模的网络架构。
  • 对于更复杂的网络和交互式的可视化,推荐使用 deepNetworkDesigner 工具,它提供了更强大的功能来分析和设计神经网络架构。

版本历史

  • 在 R2017b 中推出。
  • 从 R2024a 开始,不推荐使用 DAGNetworkSeriesNetworkLayerGraph 对象,而是建议使用 dlnetwork 对象。

总结

plot 函数是一个非常有用的工具,可以帮助你可视化和分析神经网络的结构。对于小型网络,plot 提供了清晰的层级结构图,而对于复杂的网络架构,推荐使用 deepNetworkDesigner 进行更详细的分析。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值