主要内容

sim

仿真神经网络

语法

[Y,Xf,Af] = sim(net,X,Xi,Ai,T)
[Y,Xf,Af] = sim(net,{Q TS},Xi,Ai)
[Y,...] = sim(net,...,'useParallel',...)
[Y,...] = sim(net,...,'useGPU',...)
[Y,...] = sim(net,...,'showResources',...)
[Ycomposite,...] = sim(net,Xcomposite,...)
[Ygpu,...] = sim(net,Xgpu,...)

获得帮助

键入 help network/sim

说明

sim 仿真神经网络。

[Y,Xf,Af] = sim(net,X,Xi,Ai,T) 接受

net

网络

X

网络输入

Xi

初始输入延迟条件(默认值 = 零)

Ai

初始层延迟条件(默认值 = 零)

T

网络目标(默认值 = 零)

并返回

Y

网络输出

Xf

最终输入延迟条件

Af

最终层延迟条件

sim 通常通过将神经网络作为函数调用来隐式调用。例如,以下两个表达式返回相同的结果:

y = sim(net,x,xi,ai)
y = net(x,xi,ai)

请注意,参量 XiAi, XfAf 是可选项,只有在有输入或层延迟的网络中会用到。

信号参量可以有两种格式:元胞数组或矩阵。

元胞数组格式最容易描述。对于具有多个输入和输出的网络来说,这种格式最方便,并允许呈现输入序列:

X

Ni×TS 元胞数组

每个元素 X{i,ts} 是一个 Ri×Q 矩阵。

Xi

Ni×ID 元胞数组

每个元素 Xi{i,k} 是一个 Ri×Q 矩阵。

Ai

Nl×LD 元胞数组

每个元素 Ai{i,k} 是一个 Si×Q 矩阵。

T

No×TS 元胞数组

每个元素 X{i,ts} 是一个 Ui×Q 矩阵。

Y

No×TS 元胞数组

每个元素 Y{i,ts} 是一个 Ui×Q 矩阵。

Xf

Ni×ID 元胞数组

每个元素 Xf{i,k} 是一个 Ri×Q 矩阵。

Af

Nl×LD 元胞数组

每个元素 Af{i,k} 是一个 Si×Q 矩阵。

其中

Ni = net.numInputs
Nl = net.numLayers
No = net.numOutputs
ID = net.numInputDelays
LD = net.numLayerDelays
TS =

时间步数

Q =

批量大小

Ri = net.inputs{i}.size
Si = net.layers{i}.size
Ui = net.outputs{i}.size

XiAiXfAf 的列按最早延迟条件到最近延迟条件排序:

Xi{i,k}=

在时间 ts = k - ID 处的输入 i

Xf{i,k}=

在时间 ts = TS + k - ID 处的输入 i

Ai{i,k}=

在时间 ts = k - LD 处的层输出 i

Af{i,k}=

在时间 ts = TS + k - LD 处的层输出 i

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

每个矩阵参量都是通过将对应元胞数组参量的元素以单精度矩阵形式存储来得出的:

X

(sum of Ri)×Q 矩阵

Xi

(sum of Ri)×(ID*Q) 矩阵

Ai

(sum of Si)×(LD*Q) 矩阵

T

(sum of Ui)×Q 矩阵

Y

(sum of Ui)×Q 矩阵

Xf

(sum of Ri)×(ID*Q) 矩阵

Af

(sum of Si)×(LD*Q) 矩阵

[Y,Xf,Af] = sim(net,{Q TS},Xi,Ai) 用于使用元胞数组表示法时没有输入的网络。

[Y,...] = sim(net,...,'useParallel',...)[Y,...] = sim(net,...,'useGPU',...)[Y,...] = sim(net,...,'showResources',...)(或作为函数调用的网络)接受可选的名称/值对组参量来控制计算的执行方式。如果 Parallel Computing Toolbox 可用,其中两个选项允许使用并行工作单元或 GPU 设备更快地进行训练或基于更大的数据集进行训练。以下是可选的名称/值对组:

'useParallel','no'

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

'useParallel','yes'

如果并行池处于打开状态,计算将在并行工作单元上进行。否则,计算将在普通 MATLAB 线程上进行。

'useGPU','no'

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

'useGPU','yes'

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

'useGPU','only'

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

'showResources','no'

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

'showResources','yes'

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

[Ycomposite,...] = sim(net,Xcomposite,...) 接受合成数据并返回合成结果。如果使用合成数据,则 'useParallel' 会自动设置为 'yes'

[Ygpu,...] = sim(net,Xgpu,...) 接受 gpuArray 数据并返回 gpuArray 结果。如果使用 gpuArray 数据,则 'useGPU' 会自动设置为 'yes'

示例

在以下示例中,通过将神经网络对象 (net) 作为函数调用来隐式调用 sim 函数。

仿真前馈网络

此示例加载一个将解剖学测量值 x 映射到体脂百分比 t 的数据集。创建一个具有 10 个神经元的前馈网络,并基于该数据进行训练,然后进行仿真。

[x,t] =  bodyfat_dataset;  
net = feedforwardnet(10);
net = train(net,x,t);

Figure Neural Network Training (14-Jul-2025 06:12:10) contains an object of type uigridlayout.

y = net(x);

仿真 NARX 时间序列网络

此示例使用外部输入训练一个开环非线性自回归网络,以对一个由控制电流 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,您可以更快地仿真和训练网络,并可以使用比单台 PC 容量更大的数据集。在此处,训练和仿真会跨并行 MATLAB 工作单元进行。

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

在 GPU 上进行仿真

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

Xc = Composite;
for i=1:numel(Xc)
    Xc{i} = X+rand(size(X))*0.1;  % Use real data instead of random
end
Yc = net(Xc,'showResources','yes');

如果 Parallel Computing Toolbox 支持,可以使用当前 GPU 设备仿真网络。

gpuDevice % Check if there is a supported GPU
Y = net(X,'useGPU','yes','showResources','yes');

要手动将数据放到 GPU 上,并在 GPU 上获得结果,请参考以下示例:

Xgpu = gpuArray(X);
Ygpu = net(Xgpu,'showResources','yes');
Y = gather(Ygpu);

要并行运行,与独占 GPU 相关联的工作单元使用该硬件,而其余工作线程使用 CPU,请参考以下示例:

Y = net(X,'useParallel','yes','useGPU','yes','showResources','yes');

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

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

算法

sim 使用以下属性来仿真网络 net

net.numInputs, net.numLayers
net.outputConnect, net.biasConnect
net.inputConnect, net.layerConnect

以下属性决定了网络的权重和偏置值以及与每个权重相关联的延迟数:

net.IW{i,j}
net.LW{i,j}
net.b{i}
net.inputWeights{i,j}.delays
net.layerWeights{i,j}.delays

以下函数属性指示 sim 如何将权重和偏置值应用于输入以获得每个层的输出:

net.inputWeights{i,j}.weightFcn
net.layerWeights{i,j}.weightFcn
net.layers{i}.netInputFcn
net.layers{i}.transferFcn

版本历史记录

在 R2006a 之前推出

另请参阅

| | |