classifyAndUpdateState
使用训练过的循环神经网络对数据进行分类并更新网络状态
语法
描述
你可以在CPU或GPU上使用经过训练的深度学习网络进行预测。使用GPU需要并行计算工具箱™和受支持的GPU设备。有关受支持设备的信息,请参见GPU计算要求(并行计算工具箱).属性指定硬件需求ExecutionEnvironment
名称-值参数。
对于具有多个输出的网络,使用predictAndUpdateState
函数,并设置ReturnCategorical
选项真正的
.
[
中的数据进行分类updatedNet
,Y
= classifyAndUpdateState(recNet
,序列
)序列
利用训练好的循环神经网络recNet
并更新网络状态。
这个函数只支持循环神经网络。输入recNet
必须至少有一个循环层,如LSTM层或带有状态参数的自定义层。
[
预测数值数组或单元格数组中数据的类标签updatedNet
,Y
= classifyAndUpdateState(recNet
,X1,…,XN
)X1
、……XN
对于多输入网络recNet
.输入西
对应于网络输入recNet.InputNames(我)
.
[
预测多输入网络的类标签updatedNet
,Y
= classifyAndUpdateState(recNet
,混合
)recNet
使用混合数据类型的数据。
[
还返回使用前面任何语法的类标签对应的分类分数。updatedNet
,Y
,分数
= classifyAndUpdateState(___)
___= classifyAndUpdateState (___,
使用任何先前的语法,用一个或多个名称-值参数指定的附加选项预测类标签。例如,名称=值
)MiniBatchSize = 27
使用大小为27的小批对数据进行分类。
提示
当您使用不同长度的序列进行预测时,小批大小可能会影响添加到输入数据中的填充量,从而导致不同的预测值。尝试使用不同的值,看看哪个最适合你的网络。要指定小批处理大小和填充选项,请使用MiniBatchSize
而且SequenceLength
选项,分别。
例子
分类和更新网络状态
使用循环神经网络对数据进行分类并更新网络状态。
负载JapaneseVowelsNet
,一个预先训练的长短期记忆(LSTM)网络,在日语Vowels数据集上训练,如[1]和[2]所述。该网络在按序列长度排序的序列上训练,迷你批大小为27。
负载JapaneseVowelsNet
查看网络结构。
网层
ans = 5x1层数组与层:1' sequenceinput'序列输入序列输入与12维2 'lstm' lstm lstm与100个隐藏单元3 'fc'全连接9全连接层4 'softmax' softmax softmax 5 'classoutput'分类输出crossentropyex与'1'和8个其他类
加载测试数据。
[XTest,TTest] =日本evowelstestdata;
按顺序遍历时间步骤。对每个时间步进行分类并更新网络状态。
X = XTest{94};numTimeSteps = size(X,2);为i = 1:numTimeSteps v = X(:,i);[net,label,score] = classifyAndUpdateState(net,v);标签(i) =标签;结束
在阶梯图中绘制预测的标签。图表显示了预测如何在时间步骤之间变化。
图楼梯(标签,“o”xlim([1 numTimeSteps])“时间步”) ylabel (“预测阶级”)标题(“按时间步骤分类”)
将预测结果与真实标签进行比较。画一条水平线来表示观测的真实标记。
trueLabel = TTest(94)
trueLabel =分类3.
持有在line([1 numTimeSteps],[trueLabel trueLabel],...颜色=“红色”,...线型=”——“)传说([“预测”“真正的标签”])
输入参数
recNet
- - - - - -训练后循环神经网络
SeriesNetwork
对象|DAGNetwork
对象
训练过的循环神经网络,指定为aSeriesNetwork
或者一个DAGNetwork
对象。可以通过导入预训练的网络或使用trainNetwork
函数。
recNet
是一个循环神经网络。它必须至少有一个循环层(例如,LSTM网络)。
序列
- - - - - -序列或时间序列数据
数值数组的单元格数组|数字数组|数据存储
序列或时间序列数据,指定为N-by-1单元格数组的数值数组,其中N观察数、表示单个序列的数字数组或数据存储。
对于单元格数组或数值数组输入,包含序列的数值数组的维数取决于数据的类型。
输入 | 描述 |
---|---|
向量序列 | c——- - - - - -年代矩阵,c序列特征的数量和年代是序列长度。 |
一维图像序列 | h——- - - - - -c——- - - - - -年代数组,h而且c分别对应图像的高度和通道数,和年代是序列长度。 |
二维图像序列 | h——- - - - - -w——- - - - - -c——- - - - - -年代数组,h,w,c分别对应图像的高度、宽度和通道数,和年代是序列长度。 |
三维图像序列 | h——- - - - - -w——- - - - - -d——- - - - - -c——- - - - - -年代,在那里h,w,d,c分别对应三维图像的高度、宽度、深度和通道数,和年代是序列长度。 |
对于数据存储输入,数据存储必须以序列单元格数组或第一列包含序列的表的形式返回数据。序列数据的维数必须与上表对应。
提示
在网络中输入复值数据SplitComplexInputs
输入层的选项必须为1
.
数据类型:单
|双
|int8
|int16
|int32
|int64
|uint8
|uint16
|uint32
|uint64
|细胞
复数支持:是的
X1,…,XN
- - - - - -用于多输入网络的数字或单元格数组
数字数组|单元阵列
用于多输入网络的数字或单元格数组。
对于序列预测器输入,输入必须是表示单个序列的数字数组或序列的单元格数组,其中预测器的格式与中描述的格式匹配序列
参数描述。对于图像和特征预测器输入,输入必须是一个数字数组,预测器的格式必须匹配以下之一:
数据 | 格式 |
---|---|
二维图像 | h——- - - - - -w——- - - - - -c数字数组,其中h,w,c分别为图像的高度、宽度和通道数。 |
三维图像 | h——- - - - - -w——- - - - - -d——- - - - - -c数字数组,其中h,w,d,c分别为图像的高度、宽度、深度和通道数。 |
特性数据 | c-by-1列向量,其中c是特征的数量。 |
有关如何训练具有多个输入的网络的示例,请参见训练网络图像和特征数据.
提示
在网络中输入复值数据SplitComplexInputs
输入层的选项必须为1
.
数据类型:单
|双
|int8
|int16
|int32
|int64
|uint8
|uint16
|uint32
|uint64
|细胞
复数支持:是的
混合
- - - - - -混合数据
TransformedDatastore
|CombinedDatastore
|自定义小批量数据存储
混合数据,指定为以下之一。
数据类型 | 描述 | 示例使用 |
---|---|---|
TransformedDatastore |
使用自定义转换函数转换从底层数据存储读取的批量数据的数据存储 |
|
CombinedDatastore |
从两个或多个底层数据存储中读取的数据存储 |
|
自定义小批量数据存储 | 返回小批量数据的自定义数据存储 | 使用其他数据存储不支持的格式的数据进行预测。 详细信息请参见开发自定义小批量数据存储. |
属性可以使用其他内置数据存储进行预测变换
而且结合
功能。这些函数可以将从数据存储读取的数据转换为所需的表或单元格数组格式classifyAndUpdateState
.有关更多信息,请参见用于深度学习的数据存储.
数据存储必须返回表或单元格数组中的数据。自定义小批量数据存储必须输出表。数据存储输出的格式取决于网络架构。
数据存储输出 | 示例输出 |
---|---|
单元格数组 输入的顺序由 |
数据=读取(ds) Data = 4×3 cell array {12×50 double} {28×1 double} {12×50 double} {28×1 double} {12×50 double} {28×1 double} {12×50 double} {28×1 double} |
对于序列预测器输入,输入必须是表示单个序列的数字数组或序列的单元格数组,其中预测器的格式与中描述的格式匹配序列
参数描述。对于图像和特征预测器输入,输入必须是一个数字数组,预测器的格式必须匹配以下之一:
数据 | 格式 |
---|---|
二维图像 | h——- - - - - -w——- - - - - -c数字数组,其中h,w,c分别为图像的高度、宽度和通道数。 |
三维图像 | h——- - - - - -w——- - - - - -d——- - - - - -c数字数组,其中h,w,d,c分别为图像的高度、宽度、深度和通道数。 |
特性数据 | c-by-1列向量,其中c是特征的数量。 |
有关如何训练具有多个输入的网络的示例,请参见训练网络图像和特征数据.
提示
若要将数值数组转换为数据存储,请使用ArrayDatastore
.
名称-值参数
指定可选参数对为Name1 = Value1,…,以=家
,在那里的名字
参数名称和价值
对应的值。名称-值参数必须出现在其他参数之后,但对的顺序无关紧要。
在R2021a之前,使用逗号分隔每个名称和值,并将其括起来的名字
在报价。
例子:[updatedNet,Y] = classifyAndUpdateState(recNet,C,MiniBatchSize=27)
使用大小为27的小批对数据进行分类。
MiniBatchSize
- - - - - -小批尺寸
128
(默认)|正整数
用于预测的小批的大小,指定为正整数。更大的迷你批处理需要更多的内存,但可以导致更快的预测。
当您使用不同长度的序列进行预测时,小批大小可能会影响添加到输入数据中的填充量,从而导致不同的预测值。尝试使用不同的值,看看哪个最适合你的网络。要指定小批处理大小和填充选项,请使用MiniBatchSize
而且SequenceLength
选项,分别。
数据类型:单
|双
|int8
|int16
|int32
|int64
|uint8
|uint16
|uint32
|uint64
加速度
- - - - - -性能优化
“汽车”
(默认)|“没有”
性能优化,指定为以下之一:
“汽车”
—自动应用大量适合输入网络和硬件资源的优化。“没有”
-禁用所有加速。
使用加速度
选项“汽车”
可以提供性能优势,但以增加初始运行时间为代价。具有兼容参数的后续调用速度更快。当您计划使用新的输入数据多次调用函数时,请使用性能优化。
ExecutionEnvironment
- - - - - -硬件资源
“汽车”
(默认)|“图形”
|“cpu”
硬件资源,指定为下列之一:
“汽车”
-如果有GPU,请使用GPU;否则,请使用CPU。“图形”
—使用GPU。使用GPU需要并行计算工具箱和支持的GPU设备。有关受支持设备的信息,请参见GPU计算要求(并行计算工具箱).如果并行计算工具箱或合适的GPU不可用,那么软件将返回一个错误。“cpu”
—使用CPU。
SequenceLength
- - - - - -选项垫或截断序列
“最长”
(默认)|“最短”
|正整数
填充、截断或分割输入序列的选项,指定为下列之一:
“最长”
-每个小批中的衬垫序列与最长序列具有相同的长度。这个选项不会丢弃任何数据,尽管填充会给网络带来噪声。“最短”
-截断每个小批中的序列,使其长度与最短序列相同。此选项确保不添加填充,但要以丢弃数据为代价。正整数-对于每个迷你批,将序列填充到迷你批中最长序列的长度,然后将序列分割成指定长度的更小的序列。如果发生分裂,那么软件将创建额外的小批。如果指定的序列长度没有平均分配数据的序列长度,则包含这些序列末端的小批的长度小于指定的序列长度。如果完整序列不适合内存,请使用此选项。或者,尝试通过设置。来减少每个小批的序列数
MiniBatchSize
选择较低的值。
有关填充、截断和分隔输入序列的效果的详细信息,请参见序列填充,截断和分割.
数据类型:单
|双
|int8
|int16
|int32
|int64
|uint8
|uint16
|uint32
|uint64
|字符
|字符串
SequencePaddingDirection
- - - - - -填充或截断的方向
“正确”
(默认)|“左”
填充或截断方向,指定为下列之一:
“正确”
-填充或截断右边的序列。序列在同一时间步开始,软件截断或增加填充序列的结束。“左”
-填充或截断左边的序列。该软件截断或添加填充到序列的开始,以便序列在同一时间步结束。
因为循环层处理序列数据一次一步,当循环层OutputMode
属性是“最后一次”
,最后时间步长的任何填充都会对层输出产生负面影响。若要在左侧填充或截断序列数据,请设置SequencePaddingDirection
选项“左”
.
对于序列对序列网络(当OutputMode
属性是“序列”
对于每个循环层),第一次时间步骤中的任何填充都会对早期时间步骤的预测产生负面影响。若要在右侧填充或截断序列数据,请设置SequencePaddingDirection
选项“正确”
.
有关填充、截断和分隔输入序列的效果的详细信息,请参见序列填充,截断和分割.
SequencePaddingValue
- - - - - -填充序列的值
0
(默认)|标量
用于填充输入序列的值,指定为标量。
该选项仅当SequenceLength
是“最长”
或者一个正整数。不垫序列用南
,因为这样做会在整个网络中传播错误。
数据类型:单
|双
|int8
|int16
|int32
|int64
|uint8
|uint16
|uint32
|uint64
输出参数
updatedNet
-更新网络
SeriesNetwork
对象|DAGNetwork
对象
网络更新。updatedNet
是与输入网络相同类型的网络。
Y
-预测船级标签
分类向量|单元数组的分类向量
预测类标签,作为分类向量或分类向量的单元格数组返回。的格式Y
这取决于问题的类型。
的格式说明如下表所示Y
.
任务 | 格式 |
---|---|
Sequence-to-label分类 | N-by-1的标签分类向量,其中N是观测的数量。 |
Sequence-to-sequence分类 | N标签分类序列的-by-1单元格数组,其中N是观测的数量。属性后,每个序列具有与相应输入序列相同的时间步长 对于单次观测的序列到序列的分类问题, |
分数
-预测班级成绩
矩阵|单元阵列矩阵
预测的班级分数,以矩阵或矩阵单元格数组的形式返回。的格式分数
这取决于问题的类型。
的格式说明如下表所示分数
.
任务 | 格式 |
---|---|
Sequence-to-label分类 | N——- - - - - -K矩阵,N是观察数,和K是类的数量。 |
Sequence-to-sequence分类 | N矩阵的-by-1单元数组,其中N是观测的数量。序列是矩阵K行,K是类的数量。属性后,每个序列具有与相应输入序列相同的时间步长 |
对于单次观测的序列到序列的分类问题,序列
可以是矩阵。在这种情况下,分数
是预测班级分数的矩阵。
算法
当你训练一个网络使用trainNetwork
函数,或者当您使用预测或验证函数时DAGNetwork
而且SeriesNetwork
对象,该软件使用单精度浮点运算来执行这些计算。用于训练、预测和验证的函数包括trainNetwork
,预测
,分类
,激活
.当您使用cpu和gpu训练网络时,该软件使用单精度算法。
参考文献
[1]工藤M.,富山J.,辛波M.。“使用穿过区域的多维曲线分类”模式识别信.第20卷,11-13号,第1103-1111页。
[2]UCI机器学习库:日语元音数据集.https://archive.ics.uci.edu/ml/datasets/Japanese+Vowels
扩展功能
C/ c++代码生成
使用MATLAB®Coder™生成C和c++代码。
使用注意事项和限制:
c++代码生成支持以下语法:
[updatedNet,Y] = classifyAndUpdateState(recNet,sequences)
,在那里序列
单元格数组或数值数组。[updatedNet,Y,scores] = classifyAndUpdateState(recNet,sequences)
,在那里序列
是单元格数组。__ = classifyAndUpdateState(recNet,sequences,Name=Value)
使用任何前面的语法
对于矢量序列输入,在代码生成过程中特征的数量必须是一个常数。序列长度可以是可变大小的。
对于图像序列输入,在代码生成过程中,高度、宽度和通道数必须为常数。
只有
MiniBatchSize
,SequenceLength
,SequencePaddingDirection
,SequencePaddingValue
代码生成支持名称-值参数。所有的名称-值参数必须是编译时常量。只有
“最长”
而且“最短”
选项SequenceLength
代码生成时支持名称-值参数。Intel代码生成®MKL-DNN靶不支持组合
SequenceLength =“最长”
,SequencePaddingDirection =“左”
,SequencePaddingValue = 0
名称-值参数。
GPU代码生成
使用GPU Coder™为NVIDIA®GPU生成CUDA®代码。
使用注意事项和限制:
GPU代码生成支持以下语法:
[updatedNet,Y] = classifyAndUpdateState(recNet,sequences)
,在那里序列
是单元格数组。[updatedNet,Y,scores] = classifyAndUpdateState(recNet,sequences)
,在那里序列
是单元格数组。__ = classifyAndUpdateState(__,Name=Value)
使用任何前面的语法
GPU代码生成的
classifyAndUpdateState
函数仅支持针对cuDNN和TensorRT库的循环神经网络。不支持GPU代码生成
gpuArray
的输入classifyAndUpdateState
函数。对于矢量序列输入,在代码生成过程中特征的数量必须是一个常数。序列长度可以是可变大小的。
对于图像序列输入,在代码生成过程中,高度、宽度和通道数必须为常数。
只有
MiniBatchSize
,SequenceLength
,SequencePaddingDirection
,SequencePaddingValue
代码生成支持名称-值参数。所有的名称-值参数必须是编译时常量。只有
“最长”
而且“最短”
的选项SequenceLength
代码生成时支持名称-值参数。
GPU数组
通过使用并行计算工具箱™在图形处理单元(GPU)上运行来加速代码。
的
ExecutionEnvironment
选项必须是“汽车”
或“图形”
当输入数据为:一个
gpuArray
单元格数组,包含
gpuArray
对象包含以下内容的表
gpuArray
对象一个数据存储,它输出包含
gpuArray
对象一个数据存储,它输出包含
gpuArray
对象
有关更多信息,请参见在图形处理器上运行MATLAB函数(并行计算工具箱).
版本历史
在R2017b中引入R2022b:当您指定拆分前,预测函数将迷你批填充到最长序列的长度SequenceLength
选项作为整数
从R2022b开始,当您使用序列数据进行预测时预测
,分类
,predictAndUpdateState
,classifyAndUpdateState
,激活
功能和SequenceLength
选项为整数,软件将序列填充为每个mini-batch中最长序列的长度,然后按照指定的序列长度将序列分割为mini-batch。如果SequenceLength
没有均匀划分小批的序列长度,那么最后一个分割小批的长度小于SequenceLength
.此行为可防止仅包含填充值的时间步长影响预测。
在以前的版本中,软件填充小批量的序列,使其长度匹配最接近的倍数SequenceLength
它大于或等于迷你批处理长度,然后分割数据。要再现此行为,请手动填充输入数据,以便小批具有适当倍数的长度SequenceLength
.对于序列到序列的工作流,您可能还需要手动删除与填充值对应的输出的时间步长。
MATLAB命令
你点击了一个对应于这个MATLAB命令的链接:
在MATLAB命令窗口中输入该命令来运行该命令。Web浏览器不支持MATLAB命令。
您也可以从以下列表中选择一个网站:
如何获得最佳的网站性能
选择中国站点(中文或英文)以获得最佳站点性能。其他MathWorks国家站点没有针对您所在位置的访问进行优化。