Main Content

创建神经网络对象

本主题是神经网络设计的工作流中所述的设计工作流的一部分。

创建神经网络的最简单方法是使用一个网络创建函数。为了研究如何做到这一点,您可以使用命令 feedforwardnet 创建一个简单的两层前馈网络:

net = feedforwardnet
net =

Neural Network

              name: 'Feed-Forward Neural Network'
          userdata: (your custom info)

    dimensions:

         numInputs: 1
         numLayers: 2
        numOutputs: 1
    numInputDelays: 0
    numLayerDelays: 0
 numFeedbackDelays: 0
 numWeightElements: 10
        sampleTime: 1

    connections:

       biasConnect: [1; 1]
      inputConnect: [1; 0]
      layerConnect: [0 0; 1 0]
     outputConnect: [0 1]

    subobjects:

            inputs: {1x1 cell array of 1 input}
            layers: {2x1 cell array of 2 layers}
           outputs: {1x2 cell array of 1 output}
            biases: {2x1 cell array of 2 biases}
      inputWeights: {2x1 cell array of 1 weight}
      layerWeights: {2x2 cell array of 1 weight}

    functions:

          adaptFcn: 'adaptwb'
        adaptParam: (none)
          derivFcn: 'defaultderiv'
         divideFcn: 'dividerand'
       divideParam: .trainRatio, .valRatio, .testRatio
        divideMode: 'sample'
           initFcn: 'initlay'
        performFcn: 'mse'
      performParam: .regularization, .normalization
          plotFcns: {'plotperform', plottrainstate, ploterrhist,
                    plotregression}
        plotParams: {1x4 cell array of 4 params}
          trainFcn: 'trainlm'
        trainParam: .showWindow, .showCommandLine, .show, .epochs,
                    .time, .goal, .min_grad, .max_fail, .mu, .mu_dec,
                    .mu_inc, .mu_max

    weight and bias values:

                IW: {2x1 cell} containing 1 input weight matrix
                LW: {2x2 cell} containing 1 layer weight matrix
                 b: {2x1 cell} containing 2 bias vectors

    methods:

             adapt: Learn while in continuous use
         configure: Configure inputs & outputs
            gensim: Generate Simulink model
              init: Initialize weights & biases
           perform: Calculate performance
               sim: Evaluate network outputs given inputs
             train: Train network with examples
              view: View diagram
       unconfigure: Unconfigure inputs & outputs

    evaluate:       outputs = net(inputs)

此处显示的内容简要说明了网络对象,它用于存储定义神经网络的所有信息。此处有很多细节,但有几个关键部分可以帮助您了解网络对象是如何组织的。

维度部分存储网络的整体结构。在此处,您可以看到一个网络输入(尽管一个输入可以是包含许多元素的向量)、一个网络输出和两个层。

连接部分存储网络组件之间的连接。例如,每一层都连接了一个偏置,输入连接到层 1,输出来自层 2。您还可以看到层 1 连接到层 2。(net.layerConnect 的行表示目标层,列表示源层。此矩阵中的 1 表示有连接,0 表示无连接。对于此示例,矩阵的元素 2,1 处有一个 1。)

网络对象的关键子对象包括 inputslayersoutputsbiasesinputWeightslayerWeights。使用以下命令查看第一层的 layers 子对象

net.layers{1}
Neural Network Layer

              name: 'Hidden'
        dimensions: 10
       distanceFcn: (none)
     distanceParam: (none)
         distances: []
           initFcn: 'initnw'
       netInputFcn: 'netsum'
     netInputParam: (none)
         positions: []
             range: [10x2 double]
              size: 10
       topologyFcn: (none)
       transferFcn: 'tansig'
     transferParam: (none)
          userdata: (your custom info)

一个层中神经元的数量由其 size 属性给出。在本例中,该层有 10 个神经元,这是 feedforwardnet 命令的默认大小。net 输入函数是 netsum(求和),传递函数是 tansig。例如,如果您要将传递函数更改为 logsig,可以执行以下命令:

net.layers{1}.transferFcn = 'logsig';

要查看 layerWeights 子对象以了解层 1 和层 2 之间的权重,请使用以下命令:

net.layerWeights{2,1}
Neural Network Weight

            delays: 0
           initFcn: (none)
        initConfig: .inputSize
             learn: true
          learnFcn: 'learngdm'
        learnParam: .lr, .mc
              size: [0 10]
         weightFcn: 'dotprod'
       weightParam: (none)
          userdata: (your custom info)

权重函数是 dotprod,它表示标准矩阵乘法(点积)。请注意,该层权重的大小为 0×10。我们有全部为 0 的行,是因为网络尚未针对特定数据集进行配置。输出神经元的数量等于目标向量中的行数。在配置过程中,您将为网络提供示例输入和目标,然后可以分配输出神经元的数量。

这可以让您大致了解网络对象是如何组织的。对于许多应用,您不需要直接对网络对象进行更改,因为这由网络创建函数负责。通常仅当您要覆盖系统默认值时,才需要直接访问网络对象。其他主题将说明如何针对特定网络和训练方法做到这一点。

要更详细地研究网络对象,您可能会发现对象列表(如上所示)包含每个子对象的帮助链接。点击链接,您可以有选择地调查对象中您感兴趣的部分。