Main Content

本页翻译不是最新的。点击此处可查看最新英文版本。

train

训练浅层神经网络

说明

此函数训练一个浅层神经网络。对于使用卷积或 LSTM 神经网络的深度学习,请改用 trainnettrainNetwork

示例

trainedNet = train(net,X,T,Xi,Ai,EW) 根据 net.trainFcnnet.trainParam 训练网络 net

[trainedNet,tr] = train(net,X,T,Xi,Ai,EW) 还返回训练记录。

示例

[trainedNet,tr] = train(net,X,T,Xi,Ai,EW,Name,Value) 使用一个或多个名称-值对组参数指定的其他选项训练网络。

示例

全部折叠

此处的输入 x 和目标 t 定义一个您可以进行绘图的简单函数:

x = [0 1 2 3 4 5 6 7 8];
t = [0 0.84 0.91 0.14 -0.77 -0.96 -0.28 0.66 0.99];
plot(x,t,'o')

此处 feedforwardnet 会创建一个两层前馈网络。该网络有一个包含十个神经元的隐藏层。

net = feedforwardnet(10);
net = configure(net,x,t);
y1 = net(x)
plot(x,t,'o',x,y1,'x')

训练该网络,然后重新对其进行仿真。

net = train(net,x,t);
y2 = net(x)
plot(x,t,'o',x,y1,'x',x,y2,'*')

此示例使用外部输入训练一个开环非线性自回归网络,以对一个由控制电流 x 和磁体垂直位置响应 t 定义的悬浮磁体系统建模,然后对该网络进行仿真。函数 preparets 在训练和仿真之前准备数据。它会创建开环网络的组合输入 xo,其中包含外部输入 x 和位置 t 的先前值。它还会准备延迟状态 xi

[x,t] = maglev_dataset;
net = narxnet(10);
[xo,xi,~,to] = preparets(net,x,{},t);
net = train(net,xo,to,xi);
y = net(xo,xi)

此同一系统也能够以闭环形式进行仿真。

netc = closeloop(net);
view(netc)
[xc,xi,ai,tc] = preparets(netc,x,{},t);
yc = netc(xc,xi,ai);

如果您有在训练期间未使用的硬件资源,您也许能够通过并行训练来加快网络训练速度并使用本来无法放入内存的数据集。并行训练网络需要 Parallel Computing Toolbox™,并且仅支持反向传播训练,不支持自组织映射。

在此处,训练和仿真会跨并行 MATLAB 工作进程进行。

[X,T] = vinyl_dataset;
net = feedforwardnet(10);
net = train(net,X,T,'useParallel','yes','showResources','yes');
Y = net(X);

使用合成值手动分布数据,并以合成值形式返回结果。如果数据是在分布时加载的,则尽管数据集的每个部分都必须能够放入 RAM 中,但整个数据集只受所有工作进程的 RAM 总量的限制。

[X,T] = vinyl_dataset;
Q = size(X,2);
Xc = Composite;
Tc = Composite;
numWorkers = numel(Xc);
ind = [0 ceil((1:numWorkers)*(Q/numWorkers))];
for i=1:numWorkers
    indi = (ind(i)+1):ind(i+1);
    Xc{i} = X(:,indi);
    Tc{i} = T(:,indi);
end
net = feedforwardnet;
net = configure(net,X,T);
net = train(net,Xc,Tc);
Yc = net(Xc);

请注意,在上面的示例中,函数 configure 用于设置网络输入的维度和处理设置。这通常会在调用 train 函数时自动发生,但在提供合成数据时,此步骤必须用非合成数据手动完成。

如果 Parallel Computing Toolbox 支持,可以使用当前 GPU 设备训练网络。GPU 训练当前仅支持反向传播训练,不支持自组织映射。

[X,T] = vinyl_dataset;
net = feedforwardnet(10);
net = train(net,X,T,'useGPU','yes');
y = net(X); 

要手动将数据放到 GPU 上,请使用以下代码:

[X,T] = vinyl_dataset;
Xgpu = gpuArray(X);
Tgpu = gpuArray(T);
net = configure(net,X,T);
net = train(net,Xgpu,Tgpu);
Ygpu = net(Xgpu);
Y = gather(Ygpu); 

注意在上面的示例中,函数 configure 用于设置网络输入的维度和处理设置。这通常会在调用 train 函数时自动发生,但在提供 gpuArray 数据时,此步骤必须用非 gpuArray 数据手动完成。

要并行运行(即每个工作进程分配给一个不同的独占 GPU,额外的工作进程在 CPU 上运行),请使用以下代码:

net = train(net,X,T,'useParallel','yes','useGPU','yes');
y = net(X);

仅使用分配了独占 GPU 的工作进程可能会提高速度,因为 CPU 工作进程可能跟不上。

net = train(net,X,T,'useParallel','yes','useGPU','only');
Y = net(X);

在此处,使用以不超出每两分钟一次的速率保存的检查点来训练网络。

[x,t] = vinyl_dataset;
net = fitnet([60 30]);
net = train(net,x,t,'CheckpointFile','MyCheckpoint','CheckpointDelay',120);

在计算机出现故障后,可以还原最新的网络并将其用于从故障点继续训练。检查点文件包含一个结构体变量 checkpoint,其中包括网络、训练记录、文件名、时间和编号。

[x,t] = vinyl_dataset;
load MyCheckpoint
net = checkpoint.net;
net = train(net,x,t,'CheckpointFile','MyCheckpoint');

输入参数

全部折叠

输入网络,指定为 network 对象。要创建 network 对象,请使用 feedforwardnetnarxnet 等函数。

网络输入,指定为 R×Q 矩阵或 Ni×TS 元胞数组,其中

  • R 是输入大小

  • Q 是批量大小

  • Ni = net.numInputs

  • TS 是时间步的数量

train 参数可以有两种格式:矩阵,用于静态问题和具有单输入和单输出的网络;元胞数组,用于多个时间步和具有多输入和多输出的网络。

  • 如果要只仿真一个时间步 (TS = 1),可以使用矩阵格式。这对于只有一个输入和输出的网络很方便,但也可用于有更多输入和输出的网络。当网络有多个输入时,矩阵大小为 (Ri 之和)×Q

  • 元胞数组格式更通用,对于具有多个输入和输出的网络也更方便,因为允许呈现输入序列。每个元素 X{i,ts} 是一个 Ri×Q 矩阵,其中 Ri = net.inputs{i}.size

如果使用合成数据,则 'useParallel' 会自动设置为 'yes'。该函数接受合成数据并返回合成结果。

如果使用 gpuArray 数据,则 'useGPU' 会自动设置为 'yes'。该函数接受 gpuArray 数据并返回 gpuArray 结果

注意

如果 X 的一个列包含至少一个 NaN,则 train 不会使用该列进行训练、测试或验证。

网络目标,指定为 U×Q 矩阵或 No×TS 元胞数组,其中

  • U 是输出大小

  • Q 是批量大小

  • No = net.numOutputs

  • TS 是时间步的数量

train 参数可以有两种格式:矩阵,用于静态问题和具有单输入和单输出的网络;元胞数组,用于多个时间步和具有多输入和多输出的网络。

  • 如果要只仿真一个时间步 (TS = 1),可以使用矩阵格式。这对于只有一个输入和输出的网络很方便,但也可用于有更多输入和输出的网络。当网络有多个输入时,矩阵大小为 (Ui 之和)×Q

  • 元胞数组格式更通用,对于具有多个输入和输出的网络也更方便,因为允许呈现输入序列。每个元素 T{i,ts} 是一个 Ui×Q 矩阵,其中 Ui = net.outputs{i}.size

如果使用合成数据,则 'useParallel' 会自动设置为 'yes'。该函数接受合成数据并返回合成结果。

如果使用 gpuArray 数据,则 'useGPU' 会自动设置为 'yes'。该函数接受 gpuArray 数据并返回 gpuArray 结果

请注意,T 是可选项,只有在要求目标的网络中才会用到。

注意

目标 T 中的任何 NaN 值都将被视为缺失数据。如果 T 的元素是 NaN,则该元素不会用于训练、测试或验证。

初始输入延迟条件,指定为 Ni×ID 元胞数组或 R×(ID*Q) 矩阵,其中

  • ID = net.numInputDelays

  • Ni = net.numInputs

  • R 是输入大小

  • Q 是批量大小

对于元胞数组输入,Xi 的列按最早延迟条件到最近延迟条件排序:Xi{i,k} 是在时间 ts = k - ID 处的输入 i

Xi 也是可选项,只有在有输入或层延迟的网络中会用到。

初始层延迟条件,指定为 Nl×LD 元胞数组或 (Si 之和)×(LD*Q) 矩阵,其中

  • Nl = net.numLayers

  • LD = net.numLayerDelays

  • Si = net.layers{i}.size

  • Q 是批量大小

对于元胞数组输入,Ai 的列按最早延迟条件到最近延迟条件排序:Ai{i,k} 是在时间 ts = k - LD 处的层输出 i

误差权重,指定为 No×TS 元胞数组或 (Ui 之和)×Q 矩阵,其中

  • No = net.numOutputs

  • TS 是时间步的数量

  • Ui = net.outputs{i}.size

  • Q 是批量大小

用于元胞数组输入。每个元素 EW{i,ts} 是一个 Ui×Q 矩阵,其中

  • Ui = net.outputs{i}.size

  • Q 是批量大小

误差权重 EW 的大小也可以是 1,而不是全部 NoTSUiQ 或其中任意一项。在这种情况下,EW 会自动扩展维度以匹配目标 T。这允许轻松地对任何维度(例如每个样本)的重要性进行加权,同时对另一个维度(例如时间,使用 TS=1)具有相同的重要性。如果所有维度均为 1(例如,如果 EW = {1}),则所有目标值都被视为具有相同的重要性。这是 EW 的默认值。

如上所述,误差权重 EW 可以与目标 T 具有相同的维度,或有一些维度设置为 1。例如,如果 EW 为 1×Q,则目标样本将具有不同重要性,但样本中的每个元素将具有相同的重要性。如果 EW 为 (Ui 之和)×1,则每个输出元素具有不同重要性,而所有样本将被视为具有相同的重要性。

名称-值参数

将可选的参数对组指定为 Name1=Value1,...,NameN=ValueN,其中 Name 是参数名称,Value 是对应的值。名称-值参数必须出现在其他参数后,但对各个参数对组的顺序没有要求。

如果使用的是 R2021a 之前的版本,请使用逗号分隔每个名称和值,并用引号将 Name 引起来。

示例: 'useParallel','yes'

用于指定并行计算的选项,指定为 'yes''no'

  • 'no' - 计算在普通 MATLAB 线程上进行。这是默认 'useParallel' 设置。

  • 'yes' - 如果并行池处于打开状态,计算将在并行工作进程上进行。如果没有并行池处于打开状态,软件将使用默认集群配置文件启动一个并行池。

用于指定 GPU 计算的选项,指定为 'yes''no''only'

  • 'no' - 计算在 CPU 上进行。这是默认 'useGPU' 设置。

  • 'yes' - 如果当前 gpuDevice 是受支持的 GPU,则在其上进行计算(请参阅 Parallel Computing Toolbox 了解 GPU 要求)。如果当前 gpuDevice 不受支持,则计算仍在 CPU 上进行。如果 'useParallel' 也是 'yes',并且并行池处于打开状态,则每个具有独占 GPU 的工作进程都会使用该 GPU,其他工作进程则在其各自的 CPU 内核上运行计算。

  • 'only' - 如果没有并行池处于打开状态,则此设置与 'yes' 相同。如果有并行池处于打开状态,则仅使用具有独占 GPU 的工作进程。但是,如果一个并行池处于打开状态但没有可用的受支持 GPU,则计算仍会在所有工作进程 CPU 上执行。

用于显示资源的选项,指定为 'yes''no'

  • 'no' - 在命令行中不显示使用的计算资源。这是默认设置。

  • 'yes' - 在命令行中显示实际使用的计算资源的摘要。如果请求了并行或 GPU 计算,但并行池未打开或受支持的 GPU 不可用,则实际资源可能与请求的资源不同。使用并行工作进程时,系统会描述每个工作进程的计算模式,包括池中未使用的工作进程。

减少内存使用量,指定为正整数。

对于大多数神经网络,默认 CPU 训练计算模式是一个已编译的 MEX 算法。但是,对于大型网络,计算可能采用一种 MATLAB® 计算模式。这可以使用 'showResources' 来确认。如果使用的是 MATLAB 而且内存并不充裕,则将 reduction 选项设置为大于 1 的值 N 会将训练所需的大量临时存储使用量减少至 N 分之一,不过这会增加训练时间。

检查点文件,指定为字符向量。

'CheckpointFile' 的值可以设置为保存在当前工作文件夹中的文件名、另一个文件夹中的文件路径,或设置为空字符串以禁用检查点保存(默认值)。

检查点延迟,指定为非负整数。

可选参数 'CheckpointDelay' 用于限制保存的频率。限制检查点的频率可以提高效率,因为与花在计算上的时间相比,它可以减少保存检查点所花费的时间。其默认值为 60,这意味着每分钟最多保存一次检查点。如果您希望每轮训练只保存一次检查点,请将 'CheckpointDelay' 的值设置为 0。

输出参数

全部折叠

经过训练的网络,以 network 对象形式返回。

训练记录(epochperf),以结构体形式返回,其字段取决于网络训练函数 (net.NET.trainFcn)。它可以包括如下字段:

  • 训练、数据划分以及性能函数和参数

  • 训练、验证和测试集的数据划分索引

  • 训练、验证和测试集的数据划分掩码

  • 轮数 (num_epochs) 和最佳轮次 (best_epoch)

  • 训练状态名称列表 (states)

  • 每个状态名称的字段(在整个训练过程中记录其值)

  • 在每轮训练评估的网络最优性能:基于训练集的最优性能 (best_perf),基于验证集的最优性能 (best_vperf),基于测试集的最优性能 (best_tperf)

算法

train 使用由 net.trainParam 指示的训练参数值调用由 net.trainFcn 指示的函数。

通常,一轮训练定义为向网络呈现所有输入向量一次。然后,系统会根据所有这些呈现所得的结果更新网络。

训练会一直持续,直到达到最大轮数、满足性能目标或发生 net.trainFcn 函数的任何其他停止条件。

有些训练函数并不遵循这一标准,而只是在每轮训练中呈现一个输入向量(或序列)。从并发输入向量(或序列)中为每轮训练随机选择一个输入向量(或序列)。competlayer 返回使用 trainru(执行此操作的训练函数)的网络。

版本历史记录

在 R2006a 之前推出

另请参阅

| | |