activations
计算深度学习网络层激活
语法
说明
您可以在 CPU 或 GPU 上计算深度学习网络层激活。使用 GPU 需要 Parallel Computing Toolbox™ 许可证和受支持的 GPU 设备。有关支持的设备的信息,请参阅 GPU Computing Requirements (Parallel Computing Toolbox)。使用 ExecutionEnvironment
名称-值参数指定硬件要求。
要使用经过训练的 SeriesNetwork
或 DAGNetwork
计算激活,请使用 activations
函数。要计算 dlnetwork
对象的激活,请使用 forward
或 predict
函数,并指定 Outputs
选项。
返回网络激活,其中使用一个或多个名称-值对组参数来指定额外选项。例如,act
= activations(___,Name=Value
)OutputAs="rows"
将激活输出格式指定为 "rows"
。将此语法与上述语法中的任何输入参数结合使用。请在所有其他输入参数后指定名称-值参数。
示例
使用 SqueezeNet 提取特征
此示例说明如何从预训练的卷积神经网络中提取已学习的图像特征,并使用这些特征来训练图像分类器。
特征提取是使用预训练深度网络的表征能力的最简单最快捷的方式。例如,您可以使用 fitcecoc
(Statistics and Machine Learning Toolbox™) 基于提取的特征来训练支持向量机 (SVM)。由于特征提取只需要遍历一次数据,因此如果没有 GPU 来加速网络训练,则不妨从特征提取开始。
加载数据
解压缩示例图像并加载这些图像作为图像数据存储。imageDatastore
根据文件夹名称自动标注图像,并将数据存储为 ImageDatastore
对象。通过图像数据存储可以存储大图像数据,包括无法放入内存的数据。将数据拆分,其中 70% 用作训练数据,30% 用作测试数据。
unzip("MerchData.zip"); imds = imageDatastore("MerchData", ... IncludeSubfolders=true, ... LabelSource="foldernames"); [imdsTrain,imdsTest] = splitEachLabel(imds,0.7,"randomized");
这个非常小的数据集现在具有 55 个训练图像和 20 个验证图像。显示一些示例图像。
numImagesTrain = numel(imdsTrain.Labels);
idx = randperm(numImagesTrain,16);
I = imtile(imds,"Frames",idx);
figure
imshow(I)
加载预训练网络
加载一个预训练的 SqueezeNet 网络。SqueezeNet 已基于超过一百万个图像进行训练,可以将图像分为 1000 个对象类别(例如键盘、鼠标、铅笔和多种动物)。因此,该模型已基于大量图像学习了丰富的特征表示。
net = squeezenet;
分析网络架构。
analyzeNetwork(net)
第一层(图像输入层)需要大小为 227×227×3 的输入图像,其中 3 是颜色通道数。
inputSize = net.Layers(1).InputSize
inputSize = 1×3
227 227 3
提取图像特征
网络构造输入图像的分层表示。层越深,包含的特征级别就越高,这些层使用较浅层的较低级别特征构建而成。要获得训练图像和测试图像的特征表示,请对全局平均池化层 "pool10"
使用 activations
。要获得图像的较低级别表示,请使用网络中较浅的层。
网络要求输入图像的大小为 227×227×3,但图像数据存储中的图像具有不同大小。要在将训练图像和测试图像输入到网络之前自动调整它们的大小,请创建增强的图像数据存储,指定所需的图像大小,并将这些数据存储用作 activations
的输入参数。
augimdsTrain = augmentedImageDatastore(inputSize(1:2),imdsTrain); augimdsTest = augmentedImageDatastore(inputSize(1:2),imdsTest); layer = "pool10"; featuresTrain = activations(net,augimdsTrain,layer,OutputAs="rows"); featuresTest = activations(net,augimdsTest,layer,OutputAs="rows");
从训练数据和测试数据中提取类标签。
TTrain = imdsTrain.Labels; TTest = imdsTest.Labels;
拟合图像分类器
使用从训练图像中提取的特征作为预测变量,并使用 fitcecoc
(Statistics and Machine Learning Toolbox) 拟合多类支持向量机 (SVM)。
mdl = fitcecoc(featuresTrain,TTrain);
对测试图像进行分类
使用经过训练的 SVM 模型和从测试图像中提取的特征对测试图像进行分类。
YPred = predict(mdl,featuresTest);
显示四个示例测试图像及预测的标签。
idx = [1 5 10 15]; figure for i = 1:numel(idx) subplot(2,2,i) I = readimage(imdsTest,idx(i)); label = YPred(idx(i)); imshow(I) title(label) end
计算针对测试集的分类准确度。准确度是网络预测正确的标签的比例。
accuracy = mean(YPred == TTest)
accuracy = 0.9500
此 SVM 有很高的准确度。如果使用特征提取时的准确度不够高,则尝试迁移学习。
输入参数
net
— 经过训练的网络
SeriesNetwork
对象 | DAGNetwork
对象
经过训练的网络,指定为 SeriesNetwork
或 DAGNetwork
对象。您可以通过导入预训练网络(例如,通过使用 googlenet
函数)或通过使用 trainNetwork
训练您自己的网络来获得经过训练的网络。
images
— 图像数据
数据存储 | 数值数组 | 表
图像数据,指定为下列值之一。
数据类型 | 描述 | 用法示例 | |
---|---|---|---|
数据存储 | ImageDatastore | 保存在磁盘上的图像数据存储 | 使用保存在磁盘上的图像进行预测,其中图像的大小相同。 当图像大小不同时,使用 |
AugmentedImageDatastore | 应用随机仿射几何变换(包括调整大小、旋转、翻转、剪切和平移)的数据存储 | 使用保存在磁盘上的图像进行预测,这些图像的大小不同。 | |
TransformedDatastore | 这类数据存储使用自定义变换函数变换从基础数据存储中读取的批量数据 |
| |
CombinedDatastore | 数据存储,它从两个或多个基础数据存储中读取数据 |
| |
自定义小批量数据存储 | 返回小批量数据的自定义数据存储 | 使用其他数据存储不支持的格式的数据进行预测。 有关详细信息,请参阅Develop Custom Mini-Batch Datastore。 | |
数值数组 | 指定为数值数组的图像 | 使用可放入内存且不需要调整大小等额外处理的数据进行预测。 | |
表 | 指定为表的图像 | 使用存储在表中的数据进行预测。 |
当您将数据存储用于具有多个输入的网络时,该数据存储必须为 TransformedDatastore
或 CombinedDatastore
对象。
提示
对于图像序列(例如视频数据),请使用 sequences
输入参数。
数据存储
数据存储用于读取小批量的图像和响应值。当您的数据无法放入内存或要调整输入数据的大小时,请使用数据存储。
对于图像数据,下列数据存储直接与 activations
兼容:
提示
使用 augmentedImageDatastore
对要用于深度学习的图像进行高效预处理,包括调整图像大小。不要使用 ImageDatastore
对象的 ReadFcn
选项。
ImageDatastore
允许使用预取功能批量读取 JPG 或 PNG 图像文件。如果您将 ReadFcn
选项设置为自定义函数,则 ImageDatastore
不会预取,并且通常会明显变慢。
通过使用 transform
和 combine
函数,您可以使用其他内置数据存储进行预测。这些函数可以将从数据存储中读取的数据转换为 classify
所需的格式。
数据存储输出所需的格式取决于网络架构。
网络架构 | 数据存储输出 | 示例输出 |
---|---|---|
单个输入 | 表或元胞数组,其中第一列指定预测变量。 表元素必须为标量、行向量或包含数值数组的 1×1 元胞数组。 自定义数据存储必须输出表。 | data = read(ds) data = 4×1 table Predictors __________________ {224×224×3 double} {224×224×3 double} {224×224×3 double} {224×224×3 double} |
data = read(ds) data = 4×1 cell array {224×224×3 double} {224×224×3 double} {224×224×3 double} {224×224×3 double} | ||
多个输入 | 包含至少 前 输入的顺序由网络的 | data = read(ds) data = 4×2 cell array {224×224×3 double} {128×128×3 double} {224×224×3 double} {128×128×3 double} {224×224×3 double} {128×128×3 double} {224×224×3 double} {128×128×3 double} |
预测变量的格式取决于数据的类型。
数据 | 格式 |
---|---|
二维图像 | h×w×c× 数值数组,其中 h、w 和 c 分别是图像的高度、宽度和通道数。 |
三维图像 | h×w×d×c 数值数组,其中 h、w、d 和 c 分别是图像的高度、宽度、深度和通道数 |
有关详细信息,请参阅Datastores for Deep Learning。
数值数组
对于可放入内存并且不需要增强等额外处理的数据,您可以将图像数据集指定为数值数组。
数值数组的大小和形状取决于图像数据的类型。
数据 | 格式 |
---|---|
二维图像 | h×w×c×N 数值数组,其中 h、w 和 c 分别是图像的高度、宽度和通道数,N 是图像的数量 |
三维图像 | h×w×d×c×N 数值数组,其中 h、w、d 和 c 分别是图像的高度、宽度和通道数,N 是图像的数量。 |
表
作为数据存储或数值数组的替代方法,您还可以在表中指定图像。
在表中指定图像时,表中的每行对应一个观测值。
对于图像输入,预测变量必须位于表的第一列,指定为以下项之一:
图像的绝对或相对文件路径,指定为字符向量
1×1 元胞数组,包含表示二维图像的 h×w×c 数值数组,其中 h、w 和 c 分别对应于图像的高度、宽度和通道数
提示
要将复数值数据输入到神经网络中,输入层的 SplitComplexInputs
选项必须为 1
。
数据类型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
| table
复数支持: 是
sequences
— 序列或时间序列数据
数据存储 | 数值数组组成的元胞数组 | 数值数组
序列或时间序列数据,指定为下列各项之一。
数据类型 | 描述 | 用法示例 | |
---|---|---|---|
数据存储 | TransformedDatastore | 这类数据存储使用自定义变换函数变换从基础数据存储中读取的批量数据 |
|
CombinedDatastore | 数据存储,它从两个或多个基础数据存储中读取数据 |
| |
自定义小批量数据存储 | 返回小批量数据的自定义数据存储 | 使用其他数据存储不支持的格式的数据进行预测。 有关详细信息,请参阅Develop Custom Mini-Batch Datastore。 | |
数值数组或元胞数组 | 指定为数值数组的单个序列,或指定为由数值数组组成的元胞数组的序列数据集 | 使用可放入内存且不需要自定义变换等额外处理的数据进行预测。 |
数据存储
数据存储读取若干小批量序列和响应。当您有无法放入内存的数据或要对数据应用变换时,请使用数据存储。
对于序列数据,下列数据存储直接与 activations
兼容:
自定义小批量数据存储。有关详细信息,请参阅Develop Custom Mini-Batch Datastore。
通过使用 transform
和 combine
函数,您可以使用其他内置数据存储进行预测。这些函数可以将从数据存储中读取的数据转换为 activations
所需的表或元胞数组格式。例如,您可以分别使用 ArrayDatastore
和 TabularTextDatastore
对象变换和合并从内存数组和 CSV 文件中读取的数据。
数据存储必须以表或元胞数组的形式返回数据。自定义小批量数据存储必须输出表。
数据存储输出 | 示例输出 |
---|---|
表 | data = read(ds) data = 4×2 table Predictors __________________ {12×50 double} {12×50 double} {12×50 double} {12×50 double} |
元胞数组 | data = read(ds) data = 4×2 cell array {12×50 double} {12×50 double} {12×50 double} {12×50 double} |
预测变量的格式取决于数据的类型。
数据 | 预测变量的格式 |
---|---|
向量序列 | c×s 矩阵,其中 c 是序列的特征数,s 是序列长度 |
一维图像序列 | h×c×s 数组,其中 h 和 c 分别对应图像的高度和通道数,s 是序列长度。 小批量中的每个序列必须具有相同的序列长度。 |
二维图像序列 | h×w×c×s 数组,其中 h、w 和 c 分别对应于图像的高度、宽度和通道数,s 是序列长度。 小批量中的每个序列必须具有相同的序列长度。 |
三维图像序列 | h×w×d×c×s 数组,其中 h、w、d 和 c 分别对应于图像的高度、宽度、深度和通道数,而 s 是序列长度。 小批量中的每个序列必须具有相同的序列长度。 |
对于表中返回的预测变量,元素必须包含数值标量、数值行向量或包含数值数组的 1×1 元胞数组。
有关详细信息,请参阅Datastores for Deep Learning。
数值数组或元胞数组
对于可放入内存并且不需要自定义变换等额外处理的数据,可以将单个序列指定为数值数组,或将序列数据集指定为由数值数组组成的元胞数组。
对于元胞数组输入,元胞数组必须为由数值数组组成的 N×1 元胞数组,其中 N 是观测值数目。表示序列的数值数组的大小和形状取决于序列数据的类型。
输入 | 描述 |
---|---|
向量序列 | c×s 矩阵,其中 c 是序列的特征数,s 是序列长度 |
一维图像序列 | h×c×s 数组,其中 h 和 c 分别对应于图像的高度和通道数,而 s 是序列长度 |
二维图像序列 | h×w×c×s 数组,其中 h、w 和 c 分别对应于图像的高度、宽度和通道数,s 是序列长度。 |
三维图像序列 | h×w×d×c×s,其中 h、w、d 和 c 分别对应于三维图像的高度、宽度、深度和通道数,s 是序列长度 |
提示
要将复数值数据输入到神经网络中,输入层的 SplitComplexInputs
选项必须为 1
。
数据类型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
| cell
复数支持: 是
features
— 特征数据
数据存储 | 数值数组 | 表
特征数据,指定为下列各项之一。
数据类型 | 描述 | 用法示例 | |
---|---|---|---|
数据存储 | TransformedDatastore | 这类数据存储使用自定义变换函数变换从基础数据存储中读取的批量数据 |
|
CombinedDatastore | 数据存储,它从两个或多个基础数据存储中读取数据 |
| |
自定义小批量数据存储 | 返回小批量数据的自定义数据存储 | 使用其他数据存储不支持的格式的数据进行预测。 有关详细信息,请参阅Develop Custom Mini-Batch Datastore。 | |
表 | 指定为表的特征数据 | 使用存储在表中的数据进行预测。 | |
数值数组 | 指定为数值数组的特征数据 | 使用可放入内存且不需要自定义变换等额外处理的数据进行预测。 |
数据存储
数据存储读取小批量的特征数据和响应。当您有无法放入内存的数据或要对数据应用变换时,请使用数据存储。
对于特征数据,下列数据存储直接与 activations
兼容:
自定义小批量数据存储。有关详细信息,请参阅Develop Custom Mini-Batch Datastore。
通过使用 transform
和 combine
函数,您可以使用其他内置数据存储进行预测。这些函数可以将从数据存储中读取的数据转换为 activations
所需的表或元胞数组格式。有关详细信息,请参阅Datastores for Deep Learning。
对于具有多个输入的网络,数据存储必须为 TransformedDatastore
或 CombinedDatastore
对象。
数据存储必须以表或元胞数组的形式返回数据。自定义小批量数据存储必须输出表。数据存储输出的格式取决于网络架构。
网络架构 | 数据存储输出 | 示例输出 |
---|---|---|
单个输入层 | 包含至少一列的表或元胞数组,其中第一列指定预测变量。 表元素必须为标量、行向量或包含数值数组的 1×1 元胞数组。 自定义小批量数据存储必须输出表。 | 对于具有一个输入的网络,输出的表为: data = read(ds) data = 4×2 table Predictors __________________ {24×1 double} {24×1 double} {24×1 double} {24×1 double} |
对于具有一个输入的网络,输出的元胞数组为: data = read(ds) data = 4×1 cell array {24×1 double} {24×1 double} {24×1 double} {24×1 double} | ||
多个输入层 | 包含至少 前 输入的顺序由网络的 | 对于具有两个输入的网络,输出的元胞数组为: data = read(ds) data = 4×3 cell array {24×1 double} {28×1 double} {24×1 double} {28×1 double} {24×1 double} {28×1 double} {24×1 double} {28×1 double} |
预测变量必须为 c×1 列向量,其中 c 是特征数。
有关详细信息,请参阅Datastores for Deep Learning。
表
对于可放入内存且不需要自定义变换等其他处理的特征数据,可以将特征数据和响应指定为表。
表中的每行对应一个观测值。预测变量在表列中的排列取决于任务的类型。
任务 | 预测变量 |
---|---|
特征分类 | 在一列或多列中指定为标量的特征。 |
数值数组
对于可放入内存且不需要自定义变换等额外处理的特征数据,可以将特征数据指定为数值数组。
数值数组必须为 N×numFeatures
的数值数组,其中 N 是观测值数目,numFeatures
是输入数据的特征数。
提示
要将复数值数据输入到神经网络中,输入层的 SplitComplexInputs
选项必须为 1
。
数据类型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
| table
复数支持: 是
X1,...,XN
— 对于具有多个输入的网络,该输入为数值数组或元胞数组
数值数组 | 元胞数组
对于具有多个输入的网络,该输入为数值或元胞数组。
对于图像、序列和特征预测变量输入,预测变量的格式必须分别与 images
、sequences
或 features
参数描述中所述的格式匹配。
有关如何训练具有多个输入的网络的示例,请参阅Train Network on Image and Feature Data。
要将复数值数据输入到神经网络中,输入层的 SplitComplexInputs
选项必须为 1
。
数据类型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
| cell
复数支持: 是
mixed
— 混合数据
TransformedDatastore
| CombinedDatastore
| 自定义小批量数据存储
混合数据,指定为下列各项之一。
数据类型 | 描述 | 用法示例 |
---|---|---|
TransformedDatastore | 这类数据存储使用自定义变换函数变换从基础数据存储中读取的批量数据 |
|
CombinedDatastore | 数据存储,它从两个或多个基础数据存储中读取数据 |
|
自定义小批量数据存储 | 返回小批量数据的自定义数据存储 | 使用其他数据存储不支持的格式的数据进行预测。 有关详细信息,请参阅Develop Custom Mini-Batch Datastore。 |
通过使用 transform
和 combine
函数,您可以使用其他内置数据存储进行预测。这些函数可以将从数据存储中读取的数据转换为 activations
所需的表或元胞数组格式。有关详细信息,请参阅Datastores for Deep Learning。
数据存储必须以表或元胞数组的形式返回数据。自定义小批量数据存储必须输出表。数据存储输出的格式取决于网络架构。
数据存储输出 | 示例输出 |
---|---|
具有 输入的顺序由网络的 | data = read(ds) data = 4×3 cell array {24×1 double} {28×1 double} {24×1 double} {28×1 double} {24×1 double} {28×1 double} {24×1 double} {28×1 double} |
对于图像、序列和特征预测变量输入,预测变量的格式必须分别与 images
、sequences
或 features
参数描述中所述的格式匹配。
有关如何训练具有多个输入的网络的示例,请参阅Train Network on Image and Feature Data。
提示
要将数值数组转换为数据存储,请使用 arrayDatastore
。
layer
— 要从中提取激活值的层
数值索引 | 字符向量
要从中提取激活值的层,指定为数值索引或字符向量。
要计算 SeriesNetwork
对象的激活,请使用其数值索引指定层,或指定为与层名称对应的字符向量。
要计算 DAGNetwork
对象的激活,请将层指定为与层名称对应的字符向量。如果层有多个输出,请将层和输出指定为层名称,后面依次跟字符“/”和层输出的名称。也就是说,layer
的形式为 'layerName/outputName'
。
示例: 3
示例: 'conv1'
示例: 'mpool/out'
名称-值参数
将可选的参数对组指定为 Name1=Value1,...,NameN=ValueN
,其中 Name
是参数名称,Value
是对应的值。名称-值参数必须出现在其他参数后,但对各个参数对组的顺序没有要求。
如果使用的是 R2021a 之前的版本,请使用逗号分隔每个名称和值,并用引号将 Name
引起来。
示例: MiniBatchSize=256
将小批量大小指定为 256。
OutputAs
— 输出激活的格式
"channels"
(默认) | "rows"
| "columns"
输出激活的格式,指定为 "channels"
、"rows"
或 "columns"
。有关输出格式的描述,请参阅 act
。
对于图像输入,如果 OutputAs
选项为 "channels"
,则输入数据中的图像可以大于网络的图像输入层的输入大小。对于其他输出格式,输入中的图像必须与网络的图像输入层的输入大小相同。
MiniBatchSize
— 小批量的大小
128
(默认) | 正整数
用于预测的小批量的大小,指定为正整数。小批量大小越大,需要的内存越多,但预测速度可能更快。
SequenceLength
— 填充或截断序列的选项
"longest"
(默认) | "shortest"
| 正整数
用于填充、截断或拆分输入序列的选项,指定为以下各项之一:
"longest"
- 每个小批量中的填充序列具有与最长序列相同的长度。此选项不会丢弃任何数据,尽管填充会给神经网络引入噪声。"shortest"
- 截断每个小批量中的序列,使其长度与最短的序列相同。此选项确保不添加任何填充,但代价是丢弃数据。正整数 - 对于每个小批量,将序列填充到小批量中最长的序列的长度,然后将序列拆分为指定长度的较小序列。如果发生拆分,则软件会创建额外的小批量。如果指定的序列长度没有均分数据的序列长度,则对于包含这些序列最终时间步的小批量,其长度短于指定的序列长度。如果整个序列无法放入内存中,请使用此选项。您也可以尝试通过将
MiniBatchSize
选项设置为较低的值来减少每个小批量的序列数。此选项仅支持
trainNetwork
函数。
要了解有关填充、截断和拆分输入序列的效果的详细信息,请参阅序列填充、截断和拆分。
数据类型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
| char
| string
SequencePaddingValue
— 填充序列的值
0
(默认) | 标量
用于填充输入序列的值,指定为标量。
不要用 NaN
填充序列,因为这样做会在整个神经网络中传播错误。
数据类型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
SequencePaddingDirection
— 填充或截断的方向
"right"
(默认) | "left"
填充或截断的方向,指定为以下值之一:
"right"
- 填充或截断右侧的序列。序列在相同的时间步开始,软件在序列的末尾截断或添加填充。"left"
- 填充或截断左侧的序列。软件会在序列的开头截断或添加填充,以便序列在同一时间步结束。
由于循环层一次处理一个时间步的序列数据,当循环层 OutputMode
属性为 "last"
时,最终时间步中的任何填充都会对层输出产生负面影响。要填充或截断左侧的序列数据,请将 SequencePaddingDirection
选项设置为 "left"
。
对于“序列到序列”神经网络(当每个循环层的 OutputMode
属性为 "sequence"
时),前几个时间步中的任何填充都会对较早时间步的预测产生负面影响。要填充或截断右侧的序列数据,请将 SequencePaddingDirection
选项设置为 "right"
。
要了解有关填充、截断和拆分输入序列的效果的详细信息,请参阅序列填充、截断和拆分。
Acceleration
— 性能优化
"auto"
(默认) | "mex"
| "none"
性能优化,指定为以下项之一:
"auto"
- 自动应用适用于输入网络和硬件资源的多项优化。"mex"
- 编译并执行 MEX 函数。仅在使用 GPU 时,此选项才可用。使用 GPU 需要 Parallel Computing Toolbox 许可证和受支持的 GPU 设备。有关支持的设备的信息,请参阅 GPU Computing Requirements (Parallel Computing Toolbox)。如果 Parallel Computing Toolbox 或合适的 GPU 不可用,则软件会返回错误。"none"
- 禁用所有加速。
如果 Acceleration
为 "auto"
,则 MATLAB® 会应用许多兼容的优化,并且不生成 MEX 函数。
"auto"
和 "mex"
选项可以提供性能优势,但会增加初始运行时间。使用兼容参数的后续调用会更快。当您计划使用新输入数据多次调用函数时,请使用性能优化。
"mex"
选项根据函数调用中使用的网络和参数生成并执行 MEX 函数。您可以同时将多个 MEX 函数与单个网络相关联。清除网络变量也会清除与该网络相关联的所有 MEX 函数。
"mex"
选项支持包含Supported Layers (GPU Coder)页上列出的层的网络,但 sequenceInputLayer
对象除外。
当您使用单个 GPU 时,可以使用 "mex"
选项。
要使用 "mex"
选项,您必须安装 C/C++ 编译器和 GPU Coder™ Interface for Deep Learning 支持包。使用 MATLAB 中的附加功能资源管理器安装该支持包。有关设置说明,请参阅 MEX Setup (GPU Coder)。GPU Coder 不是必需的。
对于量化网络,"mex"
选项需要具有 6.1、6.3 或更高计算能力的支持 CUDA® 的 NVIDIA® GPU。
当您使用 "mex"
选项时,MATLAB Compiler™ 不支持部署网络。
ExecutionEnvironment
— 硬件资源
"auto"
(默认) | "gpu"
| "cpu"
| "multi-gpu"
| "parallel"
硬件资源,指定为以下项之一:
"auto"
- 如果有可用的 GPU,则使用 GPU;如果没有,则使用 CPU。"gpu"
- 使用 GPU。使用 GPU 需要 Parallel Computing Toolbox 许可证和受支持的 GPU 设备。有关支持的设备的信息,请参阅 GPU Computing Requirements (Parallel Computing Toolbox)。如果 Parallel Computing Toolbox 或合适的 GPU 不可用,则软件会返回错误。"cpu"
- 使用 CPU。"multi-gpu"
- 在一台计算机上使用多个 GPU,根据您的默认集群配置文件使用本地并行池。如果当前没有并行池,软件将启动并行池,其池大小等于可用 GPU 的数量。"parallel"
- 根据您的默认集群配置文件使用本地或远程并行池。如果当前没有并行池,软件将使用默认集群配置文件启动一个并行池。如果池可以访问 GPU,则只有拥有唯一 GPU 的工作进程才能执行计算。如果该池没有 GPU,则将在所有可用的 CPU 工作进程上进行计算。
有关何时使用不同执行环境的详细信息,请参阅Scale Up Deep Learning in Parallel, on GPUs, and in the Cloud。
"gpu"
、"multi-gpu"
和 "parallel"
选项需要 Parallel Computing Toolbox。要使用 GPU 进行深度学习,您还必须拥有支持的 GPU 设备。有关受支持设备的信息,请参阅GPU Computing Requirements (Parallel Computing Toolbox)。如果您选择其中一个选项,而 Parallel Computing Toolbox 或合适的 GPU 不可用,则软件会返回错误。
要使用具有循环层的多个网络并行进行预测(通过将 ExecutionEnvironment
设置为 "multi-gpu"
或 "parallel"
),SequenceLength
选项必须为 "shortest"
或 "longest"
。
如果网络的自定义层包含 State
参数,则该网络不支持并行进行预测。
输出参数
act
— 来自网络层的激活值
数值数组 | 元胞数组
来自网络层的激活值,以数值数组或由数值数组组成的元胞数组的形式返回。act
的格式取决于输入数据的类型、层输出的类型以及指定的 OutputAs
选项。
图像或折叠序列输出
如果层输出的是图像或折叠序列数据,则 act
是一个数值数组。
OutputAs | act |
---|---|
"channels" | 对于二维图像输出, 对于三维图像输出, 对于折叠的二维图像序列输出, 对于折叠的三维图像序列输出, |
"rows" | 对于二维和三维图像输出, 对于折叠的二维和三维图像序列输出, |
"columns" | 对于二维和三维图像输出, 对于折叠的二维和三维图像序列输出, |
序列输出
如果 layer
具有序列输出(例如,输出模式为 "sequence"
的 LSTM 层),则 act
是一个元胞数组。在这种情况下,"OutputAs"
选项必须为 "channels"
。
OutputAs | act |
---|---|
"channels" | 对于向量序列输出, 对于二维图像序列输出, 对于三维图像序列输出, 在这些情况下, |
特征向量和单个时间步输出
如果 layer
输出特征向量或序列的单个时间步(例如,输出模式为 "last"
的 LSTM 层),则 act
是一个数值数组。
OutputAs | act |
---|---|
"channels" | 对于包含向量数据的特征向量或单个时间步, 对于包含二维图像数据的单个时间步, 对于包含三维图像数据的单个时间步, |
"rows" | n×m 矩阵,其中 n 是观测值数目,m 是所选层的输出元素数。在这种情况下,act(i,:) 包含第 i 个序列的激活。 |
"columns" | m×n 矩阵,其中 m 是所选层的输出元素数,n 是观测值数目。在这种情况下,act(:,i) 包含第 i 个图像的激活。 |
算法
浮点算术
当您使用 trainnet
或 trainNetwork
函数训练神经网络时,或当您对 DAGNetwork
和 SeriesNetwork
对象使用预测或验证函数时,软件会使用单精度浮点算术来执行这些计算。用于预测和验证的函数包括 predict
、classify
和 activations
。当您使用 CPU 和 GPU 来训练神经网络时,软件将使用单精度算术。
可再现性
为了提供最优性能,在 MATLAB 中使用 GPU 的深度学习不保证是确定性的。根据您的网络架构,在某些情况下,当使用 GPU 训练两个相同的网络或使用相同的网络和数据进行两次预测时,您可能会得到不同结果。
扩展功能
C/C++ 代码生成
使用 MATLAB® Coder™ 生成 C 代码和 C++ 代码。
用法说明和限制:
C++ 代码生成支持以下语法:
act = activations(net,images,layer)
,其中images
是数值数组act = activations(net,sequences,layer)
,其中sequences
是元胞数组act = activations(net,features,layer)
,其中features
是数值数组act = activations(__,Name,Value)
使用上述任一语法
对于数值输入,输入不能有可变大小。输入的大小必须在代码生成时固定。
对于向量序列输入,特征数在代码生成期间必须为常量。序列长度是可变的。
对于图像序列输入,高度、宽度和通道数在代码生成期间必须为常量。
在代码生成过程中,
layer
参数必须为常量。代码生成仅支持
OutputAs
、MiniBatchSize
、SequenceLength
、SequencePaddingDirection
和SequencePaddingValue
名称-值对组参数。所有名称-值对组都必须为编译时常量。输出激活的格式必须为
"channels"
。代码生成仅支持
SequenceLength
名称-值对组的"longest"
和"shortest"
选项。Intel® MKL-DNN 目标的代码生成不支持
SequenceLength="longest"
、SequencePaddingDirection="left"
和SequencePaddingValue=0
名称-值参数组合。
有关为深度学习神经网络生成代码的详细信息,请参阅使用 MATLAB Coder 生成深度学习代码的工作流 (MATLAB Coder)。
GPU 代码生成
使用 GPU Coder™ 为 NVIDIA® GPU 生成 CUDA® 代码。
用法说明和限制:
GPU 代码生成支持以下语法:
act = activations(net,images,layer)
,其中images
是数值数组act = activations(net,sequences,layer)
,其中sequences
是元胞数组或数值数组act = activations(net,features,layer)
,其中features
是数值数组act = activations(__,Name,Value)
使用上述任一语法
对于数值输入,输入不能有可变大小。输入的大小必须在代码生成时固定。
GPU 代码生成不支持
activations
函数的gpuArray
输入。cuDNN 库支持向量和二维图像序列。TensorRT 库仅支持向量输入序列。GPU 的 ARM®
Compute Library
不支持循环网络。对于向量序列输入,特征数在代码生成期间必须为常量。序列长度是可变的。
对于图像序列输入,高度、宽度和通道数在代码生成期间必须为常量。
在代码生成过程中,
layer
参数必须为常量。代码生成仅支持
OutputAs
、MiniBatchSize
、SequenceLength
、SequencePaddingDirection
和SequencePaddingValue
名称-值对组参数。所有名称-值对组都必须为编译时常量。输出激活的格式必须为
"channels"
。代码生成仅支持
SequenceLength
名称-值对组的"longest"
和"shortest"
选项。activations
函数的 GPU 代码生成支持定义为半精度浮点数据类型的输入。有关详细信息,请参阅half
(GPU Coder)。
GPU 数组
通过使用 Parallel Computing Toolbox™ 在图形处理单元 (GPU) 上运行来加快代码执行。
当输入数据为以下值时,
ExecutionEnvironment
选项必须为"auto"
或"gpu"
:gpuArray
包含
gpuArray
对象的元胞数组包含
gpuArray
对象的表输出包含
gpuArray
对象的元胞数组的数据存储输出包含
gpuArray
对象的表的数据存储
有关详细信息,请参阅Run MATLAB Functions on a GPU (Parallel Computing Toolbox)。
版本历史记录
在 R2016a 中推出R2022b: 当您将 SequenceLength
选项指定为整数时,预测函数会将小批量填充到拆分前的最长序列的长度
从 R2022b 开始,如果您使用 predict
、classify
、predictAndUpdateState
、classifyAndUpdateState
和 activations
函数对序列数据进行预测,并且 SequenceLength
选项设置为整数,则软件会将序列填充到每个小批量中最长序列的长度,然后再将这些序列拆分为具有指定序列长度的小批量。如果 SequenceLength
未均分小批量的序列长度,则最后拆分的小批量的长度短于 SequenceLength
。此行为可防止仅包含填充值的时间步影响预测。
在以前的版本中,软件会填充小批量序列,使其长度与大于或等于小批量长度的 SequenceLength
的最邻近倍数匹配,然后拆分数据。要重现此行为,请手动填充输入数据,使小批量的长度为 SequenceLength
的适当倍数。对于“序列到序列”工作流,您可能还需要手动删除输出中与填充值对应的时间步。
MATLAB 命令
您点击的链接对应于以下 MATLAB 命令:
请在 MATLAB 命令行窗口中直接输入以执行命令。Web 浏览器不支持 MATLAB 命令。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)