你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
卷积
Convolution (w, input,
{kernel dimensions},
mapDims = {map dimensions},
stride = {stride dimensions},
sharing = {sharing flags},
autoPadding = {padding flags (boolean)},
lowerPad = {lower padding (int)},
upperPad = {upper padding (int)},
maxTempMemSizeInSamples = 0)
Convolution()
使用图像或张量计算权重矩阵的卷积。 此操作用于图像处理应用程序和语言处理。 它支持任何维度、步幅、共享或填充。
此函数对窗体 [M1 x M2 x ... x Mn x inChannels]
的输入张量进行操作。 这可以理解为排名n
对象,其中每个条目由一个 inChannels
-维向量组成。
例如,RGB 图像具有尺寸 [W x H x 3]
,即 [W x H]
大小调整的结构,其中每个条目 (像素) 由一个 3 元组 (注释组成,但是,内存存储格式是 3 个大小 [W x H]
平面) 的串联。
Convolution()
将输入与 n+1
-dimension 筛选器混淆,其中第一 n
个维度是筛选器的空间范围,最后一个维度必须等于 inChannels
。 有 outChannels
筛选器。 例如,对于每个输出位置,将计算维度 outChannels
向量。 因此,筛选器参数的总数为 (M1*M2*...*Mn) * inChannels * outChannels
。
Convolution()
具有以下参数:
w
- 卷积筛选器权重,存储为维度[outChannels, (M1*M2*...*Mn)]
矩阵,其中(M1*M2*...*Mn)
必须是内核维度的乘积,例如75
,对于 3 个[5 x 5]
输入通道上的大小筛选器。input
- 卷积输入。 具有维度的[M1 x M2 x ... x Mn x inChannels]
张量。kernel dimensions
- 筛选器的维度, 包括 输入通道的数量,作为 BrainScript 向量提供。 最后一个维度必须等于输入通道的数目。 例如(5:5:3)
,对于[5 x 5]
3 通道输入的筛选器。mapDims
- [命名,可选,默认值为 0] (=调用outChannels
上述输出通道数;与生成的特征映射) 深度相同。 0 表示使用行维度w
stride
- [named, optional, default is 1] stride dimensions. 步幅 1 表示只计算步幅 > 值的倍数的像素位置。 例如,2 的步幅将导致维度的减半。 与输入通道数相排的最后一个步幅维度必须与输入通道数相等。sharing
- [命名,可选,默认值为 true] 共享每个输入维度的标志autoPadding
- [命名,可选,默认值为 true] 每个输入维度的标志,无论它是否应该自动填充 (,即对称) 或根本不填充。 填充意味着卷积内核应用于所有像素位置,其中,区域之外的所有像素都假定为零 (“填充为零”) 。 如果没有填充,内核只会转移到内核的所有输入仍位于该区域内的位置。 在这种情况下,输出维度将小于输入维度。 与输入通道数相排的最后一个值必须是false
。lowerPad
- [命名,可选,默认值为 0] 每个输入维度的精确下填充。upperPad
- [命名,可选,默认值为 0] 每个输入维度的精确上填充。maxTempMemSizeInSamples
- [命名可选]) 样本中应保留的最大辅助内存量 (,这些内存量应保留以执行卷积操作。 某些卷积引擎 (例如 cuDNN 和基于 GEMM 的引擎,) 可以从使用工作区中受益,因为它可以提高性能。 但是,有时这可能会导致内存利用率较高。 默认值为 0,表示与输入样本相同。
窗体的所有值 {...}
实际上都必须作为冒号分隔的值序列(例如 (5:5)
,对于内核维度)。 (如果使用已 NDLNetworkBuilder
弃用,则必须用逗号分隔并括在 { }
内。)
示例:
ConvReLULayer(inp, outMap, inMap, kW, kH, hStride, vStride, wScale, bValue) =
[
W = Parameter (outMap, inMap * kW * kH, init="gaussian", initValueScale=wScale)
b = Parameter (outMap, 1, init="fixedValue", value=bValue)
c = Convolution (W, inp, (kW:kH:inMap), stride=(hStride:vStride:inMap), autoPadding=(true:true:false))
y = RectifiedLinear (c + b)
].y
注意:如果使用已弃用 NDLNetworkBuilder
,则本示例中不应有尾随 .y
。
简化的 2D 卷积 (仅弃用 NDL)
现已弃用的 NDL 语言提供了简化的 2D 变体:Convolution()
Convolution (w, image,
kernelWidth, kernelHeight, mapDims,
horizontalStride, verticalStride,
zeroPadding=false, maxTempMemSizeInSamples=0, imageLayout="cudnn" /* or "HWC"*/ )
其中:
w
- 卷积权重矩阵,其维度为[mapDims, kernelWidth * kernelHeight * inputChannels]
.image
- 输入图像。kernelWidth
- 内核的宽度kernelHeight
- 内核的高度mapDims
- 输出功能映射深度 (输出通道数)horizontalStride
- 水平方向的步幅verticalStride
- 垂直方向的步幅zeroPadding
- [命名可选] 指定是否应用零填充图像的两侧。 默认值为 false。maxTempMemSizeInSamples
- [命名可选]) 样本中应保留的最大辅助内存量 (,这些内存量应保留以执行卷积操作。 某些卷积引擎 (例如 cuDNN 和基于 GEMM 的引擎,) 可以从使用工作区中受益,因为它可以提高性能。 但是,有时这可能会导致内存利用率较高。 默认值为 0,表示与输入样本相同。imageLayout
- [命名可选] 每个图像的存储格式。 这是一个旧选项。 默认情况下HWC
,它表示每个图像都存储为[channel, width, height]
列主列。 如果使用 cuDNN 加快训练速度,则应将其设置为cudnn
,这意味着每个图像都存储为[width, height, channel]
a0/a0>。 请注意,cudnn
布局适用于 GPU 和 CPU,因此建议在默认情况下使用它。