你当前正在访问 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,因此建议在默认情况下使用它。