主要内容

选择神经网络输入输出处理函数

本主题介绍了一个典型的多层网络工作流程的一部分。有关更多信息和其他步骤,请参见多层浅神经网络与反向传播训练

神经网络如果您对网络输入和目标执行某些预处理步骤,那么训练可以更有效。本节介绍几种可以使用的预处理例程。(其中最常见的是在创建网络时自动提供的,它们成为网络对象的一部分,因此无论何时使用网络,进入网络的数据都以相同的方式进行预处理。)

例如,在多层网络中,隐层中通常使用sigmoid传递函数。当净输入大于3 (exp(−3)≅0.05)时,这些函数基本饱和。如果这种情况发生在训练过程的开始,梯度会非常小,网络训练会非常慢。在网络的第一层,净输入是输入乘以权值加上偏置的乘积。如果输入非常大,那么权值必须非常小,以防止传递函数饱和。在将输入应用到网络之前,规范化输入是一种标准实践。

通常,归一化步骤应用于数据集中的输入向量和目标向量。这样,网络输出总是处于一个规范化的范围内。当网络投入现场使用时,网络输出可以反向转换回原始目标数据的单位。

最容易想到的是,神经网络有一个出现在输入和网络第一层之间的预处理块和一个出现在网络最后一层和输出之间的后处理块,如下图所示。

工具箱中的大部分网络创建函数,包括多层网络创建函数,如feedforwardnet,自动为网络输入和输出分配处理功能。这些函数将您提供的输入值和目标值转换为更适合网络训练的值。

您可以在创建网络后通过调整网络属性来覆盖默认的输入和输出处理功能。

要查看分配给网络输入的处理函数的单元格数组列表,请访问此属性:

net.inputs {1} .processFcns

其中索引1指的是第一个输入向量。(前馈网络只有一个输入向量。)要查看双层网络输出返回的处理函数,请访问此network属性:

net.outputs {2} .processFcns

其中索引2指的是来自第二层的输出向量。(前馈网络只有一个输出向量,它来自最后一层)您可以使用这些属性来更改希望网络应用于输入和输出的处理函数。但是,缺省设置通常提供出色的性能。

一些处理函数具有自定义其操作的参数。您可以访问或更改的参数th对网络输入的输入处理函数如下:

net.inputs {1} .processParams{我}

您可以访问或更改的参数th与第二层相关联的网络输出的输出处理函数如下:

net.outputs {2} .processParams{我}

用于多层网络创建等功能feedforwardnet,默认的输入处理函数为removeconstantrows而且mapminmax.对于输出,默认的处理函数也是removeconstantrows而且mapminmax

下表列出了最常用的预处理和后处理函数。在大多数情况下,您不需要直接使用它们,因为预处理步骤成为网络对象的一部分。当你模拟或训练网络时,预处理和后处理将自动完成。

函数

算法

mapminmax

将输入/目标归一化到范围[−1,1]

mapstd

标准化输入/目标,使均值和方差为零

processpca

从输入向量中提取主成分

fixunknowns

处理未知输入

removeconstantrows

删除恒定的输入/目标

表示未知或不关心的目标

未知或“不关心”的目标可以表示为值。我们不希望未知的目标值对训练产生影响,但是如果一个网络有多个输出,那么任何目标向量的某些元素可能是已知的,而其他元素则是未知的。一种解决方案是从训练集中删除部分未知的目标向量及其相关的输入向量,但这涉及到良好的目标值的损失。更好的解决方案是用值。为了计算性能和性能的导数,工具箱中的所有性能函数都将忽略这些目标。