Main Content

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

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

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

例如,在多层网络中,sigmoid 传递函数通常用于隐含层。当净输入大于 3 (exp (−3) ≅ 0.05) 时,这些函数基本饱和。如果在训练过程开始就发生这种情况,梯度将非常小,并且网络训练将非常慢。在网络的第一层,净输入是输入乘以权重的乘积加上偏置。如果输入非常大,则权重必须非常小,以防止传递函数变得饱和。标准做法是在将输入应用于网络之前对其进行归一化。

通常,对数据集中的输入向量和目标向量都应用归一化步骤。这样,网络输出始终在归一化后的范围内。然后,当网络投入实际使用时,网络输出可以反向变换回原始目标数据的单位。

对神经网络最形象的描述是:在输入和网络的第一层之间有一个预处理模块,在网络的最后一层和输出之间有一个后处理模块,如下图所示。

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

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

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

net.inputs{1}.processFcns

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

net.outputs{2}.processFcns

其中索引 2 引用来自第二层的输出向量。(对于前馈网络,只有一个输出向量,它来自最终层。)您可以使用这些属性来更改您希望网络应用于输入和输出的处理函数。然而,默认值通常能提供出色性能。

几个处理函数具有可自定义其运算的参数。您可以访问或更改网络输入的第 i 个输入处理函数的参数,如下所示:

net.inputs{1}.processParams{i}

对于与第二层相关联的网络输出,您可以访问或更改第 i 个输出处理函数的参数,如下所示:

net.outputs{2}.processParams{i}

对于多层网络创建函数,如 feedforwardnet,默认输入处理函数是 removeconstantrowsmapminmax。对于输出,默认处理函数也是 removeconstantrowsmapminmax

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

函数

算法

mapminmax

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

mapstd

归一化输入/目标,使其具有零均值和单位方差

processpca

从输入向量中提取主成分

fixunknowns

处理未知输入

removeconstantrows

删除作为常量的输入/目标

表示未知或不关心的目标

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