主要内容

使用表格数据训练神经网络

R2026b

表格数据是指组织成表的数据,其中行对应于观测值(例如不同的汽车),列对应于这些观测值的不同特征(例如不同汽车的尺寸和重量)。您可以训练分类神经网络来预测分类标签(例如汽车制造商),或者可以训练回归神经网络来预测数值(例如汽车的里程数)。

下图显示了一个表格数据流经分类神经网络的示例,该网络使用变速箱数据预测齿轮故障。

Diagram showing a neural network with tabular data as input and categorical labels as output. The input data is numeric. The output predictions have labels "No Tooth Fault" and "Tooth Fault".

训练用于表格数据的神经网络有以下几种方法:

  • 使用 Statistics and Machine Learning Toolbox™ 训练神经网络模型 - fitcnet (Statistics and Machine Learning Toolbox) 函数和 fitrnet (Statistics and Machine Learning Toolbox) 函数分别适用于大多数分类和回归神经网络任务。这通常是最简单的选项。有关详细信息,请参阅使用 Statistics and Machine Learning Toolbox 训练分类和回归模型。

  • 使用 Deep Learning Toolbox™ 训练神经网络模型。

    • 内置训练 - trainnet 函数非常适合使用 Adam 和 SGDM 等随机求解器进行训练,或者使用自定义损失函数或具有多个输入或输出的神经网络进行训练。如果您希望自定义训练算法和损失函数,请使用此选项。有关详细信息,请参阅内置训练。

    • 自定义训练循环 - 如果 Deep Learning Toolbox 未提供您所需的训练选项,或者您的模型无法定义为层网络,那么您可以使用自动微分定义自己的自定义训练循环。有关详细信息,请参阅自定义训练循环。

使用 Statistics and Machine Learning Toolbox 训练分类和回归模型

使用 fitcnet (Statistics and Machine Learning Toolbox) 或 fitrnet (Statistics and Machine Learning Toolbox) 函数分别训练用于表格数据的分类神经网络或回归神经网络,通常这两种方法是最简单的选项。默认情况下,这些函数会训练多层感知器 (MLP) 神经网络。MLP 是一种神经网络,由一系列全连接层组成,这些全连接层之间具有激活层。fitcnet 和 fitcnet 函数使用有限内存的 Broyden–Fletcher–Goldfarb–Shanno (L-BFGS) 求解器拟合模型。该求解器是一个全批量求解器,在单次迭代中处理整个数据集。您可以轻松自定义神经网络架构的各方面,例如设置全连接层的大小和数量。您还可以自定义训练算法,例如设置训练迭代次数。

例如,假设有一个训练数据表 tbl,其目标值位于变量 responseName 中,可以运行以下命令来训练分类神经网络。

Mdl = fitcnet(tbl,responseName);

如果 fitcnet 和 fitrnet 函数未提供您所需的网络架构功能,例如自定义激活函数或具有跳跃连接的神经网络,则您可以使用层数组或 dlnetwork 对象定义神经网络架构。 (自 R2025a 起)以下代码显示了如何指定具有跳跃连接和泄漏 ReLU 层的神经网络。

net = dlnetwork;

layers = [
    featureInputLayer(inputSize)
    fullyConnectedLayer(12)
    leakyReluLayer(Name="lrelu1")

    fullyConnectedLayer(12)

    additionLayer(2,Name="add2")
    leakyReluLayer(Name="lrelu2")

    fullyConnectedLayer(12)
    additionLayer(2,Name="add3")
    leakyReluLayer

    fullyConnectedLayer(outputSize)
    softmaxLayer];

net = addLayers(net,layers);
net = connectLayers(net,"lrelu1","add2/in2");
net = connectLayers(net,"lrelu2","add3/in2");

Mdl = fitcnet(tbl,responseName,Network=net);

有关可用层的列表,请参阅深度学习层列表。如果 Deep Learning Toolbox 未提供您所需的层,您可以定义自己的层。有关详细信息,请参阅定义自定义深度学习层。

如果您通过指定层数组或 dlnetwork 来训练神经网络,则要检查网络架构和可学习参数,因此请将模型转换为 dlnetwork 对象。例如,要查看神经网络架构并检查可学习参数和激活的大小,请运行以下命令。

net = dlnetwork(Mdl);
analyzeNetwork(net);

Network analysis showing neural network architecture and the layer names, types, activation sizes, learnable sizes, and state sizes.

使用 Deep Learning Toolbox 训练神经网络

内置训练

如果 fitcnet 和 fitrnet 函数未提供您所需的训练算法选项,则通常最简单的选项是将 trainnet 与训练选项对象结合使用。例如,使用 trainnet 函数通过 Adam 和 SGDM 等求解器进行训练,或者使用自定义损失函数进行训练。

要使用 Adam 求解器训练简单的 MLP 网络,请运行以下命令。

layers = [
    featureInputLayer(inputSize)
    fullyConnectedLayer(16)
    reluLayer
    fullyConnectedLayer(32)
    reluLayer
    fullyConnectedLayer(outputSize)
    softmaxLayer];

options = trainingOptions("adam");

net = trainnet(tbl,layers,"crossentropy",options);

有关如何使用 trainnet 函数训练用于表格数据的神经网络的示例,请参阅Train Neural Network with Tabular Data。

自定义训练循环

如果 trainingOptions 函数未提供您需要的训练选项(例如,自定义求解器),则您可以使用自动微分定义自己的自定义训练循环。有关详细信息,请参阅自定义训练循环。

例如,要使用自定义可学习参数更新函数 myupdate 训练神经网络,请运行以下命令。

epoch = 0;
iteration = 0;
while epoch < numEpochs
    epoch = epoch + 1;

    reset(mbq);

    while hasdata(mbq)
        iteration = iteration + 1;
        [X,T] = next(mbq);

        [loss,gradients] = dlfeval(lossFcn,net,X,T);

        net = myupdate(net,gradients);
    end
end

对于无法指定为由层组成的网络的深度学习模型,例如包含循环或条件分支的模型,您可以使用 MATLAB® 函数并结合自动微分来定义模型。要训练定义为函数的模型,请使用自定义训练循环。有关详细信息,请参阅Train Network Using Model Function。

例如,要使用 MATLAB 代码定义具有单个输入和单个输出的模型,您可以定义如下形式的函数。

function Y = model(parameters,X)
   ...
end
其中,parameters 是可学习参数的数组或结构体,X 是模型输入,指定为 dlarray 对象,而 Y 是模型输出。

另请参阅

(Statistics and Machine Learning Toolbox) | (Statistics and Machine Learning Toolbox) | | | |

主题