ConvolutionLayer[n,s]
表示可训练的卷积层,具有 n 个输出通道并使用大小为 s 的核计算卷积.
ConvolutionLayer[n,{s}]
表示一个网络层,用大小为 s 的核进行一维卷积计算.
ConvolutionLayer[n,{h,w}]
表示使用大小为 h×w 的核进行二维卷积计算的网络层.
ConvolutionLayer[n,{h,w,d}]
表示核大小为 h×w×d 的二维卷积.
ConvolutionLayer[n,kernel,opts]
包括填充和其他参数的选项.
ConvolutionLayer
ConvolutionLayer[n,s]
表示可训练的卷积层,具有 n 个输出通道并使用大小为 s 的核计算卷积.
ConvolutionLayer[n,{s}]
表示一个网络层,用大小为 s 的核进行一维卷积计算.
ConvolutionLayer[n,{h,w}]
表示使用大小为 h×w 的核进行二维卷积计算的网络层.
ConvolutionLayer[n,{h,w,d}]
表示核大小为 h×w×d 的二维卷积.
ConvolutionLayer[n,kernel,opts]
包括填充和其他参数的选项.
更多信息和选项
- ConvolutionLayer 是一种网络层,对输入应用卷积运算.
- ConvolutionLayer 通常用于识别图像模式,也可用于空间数据分析、计算机视觉、自然语言处理等领域.
- 一个具有 n 个输出通道的层,应用于具有 m 个输入通道及一个或多个空间维度的输入数组时,实际上会执行 n×m 个不同的卷积运算(跨越空间维度),从而生成具有 n 个通道的输出数组.
- ConvolutionLayer[…][input] 把层应用到 input 显式计算输出.
- ConvolutionLayer[…][{input1,input2,…}] 显式计算每个 inputi 的输出.
- 在 ConvolutionLayer[n,s] 中,当卷积层在 NetChain、NetGraph 等中相连的情况下,将会由推导得出卷积层的维数.
- 可以包括以下可选参数:
-
"Biases" Automatic 核偏差 (bias) 的初始向量 "ChannelGroups" 1 通道组的数量 "Dilation" 1 扩张因子 "Dimensionality" Automatic 卷积层空间维度的个数 Interleaving False 通道维度的位置 LearningRateMultipliers Automatic 内核权重和/或偏差的学习率乘数 PaddingSize 0 应用到输入的零填充的数量 "Stride" 1 使用的卷积步长 "Weights" Automatic 核权重的初始数组 - PaddingSize 的设置可以为以下形式:
-
n 在每个维度的开头和结尾用 n 个零进行填充 {n1,n2,…} 在第 i
个维度的开头和结尾用 n 个零进行填充{{n1,m1},{n2,m2},…} 在第 i
个维度的开头用 ni 个零进行填充,在结尾用 mi 个零进行填充"Same" 填充每个维度,使输出大小等于输入大小除以步幅(向上取整) - "Dilation" 和 "Stride" 的设置可以为以下形式:
-
n 对所有维度都使用值 n {…,ni,…} 对第 i
个维度使用值 ni - 通过设置 "ChannelGroups"g,将 m 个输入通道和 n 个输出通道分别划分为 g 个由 m/g 个和 n/g 个通道形成的组,其中 m 和 n 要能被 g 整除. 分别执行连接第 i
组输入通道和第 i
组输出通道的卷积,并在结果中将结果顺连起来. 每个输入/输出通道组合由 n/g×m/g 卷积相连,所以设置 "ChannelGroups"g 有效地将不同卷积的数量从 n×m 减少到 n×m/g. - 设置 "Biases"None 指定不应使用偏差.
- 当设置为 InterleavingFalse,通道维数被作为输入和输出数组的第一个维度.
- 当设置为 InterleavingTrue,通道维数被作为输入和输出数组的最后一个维度.
- 如果加上权重和偏差, ConvolutionLayer[…][input] 会根据对网络层的应用明确计算输出.
- ConvolutionLayer[…][{input1,input2,…}] 对每个 inputi 明确计算输出.
- NetExtract 可用来从 ConvolutionLayer 对象提取权重和偏差.
- ConvolutionLayer 常被用在 NetChain、NetGraph 等函数中.
- ConvolutionLayer 开放下列端口以便在 NetGraph 等中使用:
-
"Input" 2、3 或 4 阶的数组 "Output" 2、3 或 4 阶的数组 - ConvolutionLayer 可对含有 "Varying" 维度的数组进行运算.
- 在较大的网络中,当不能从其他层推断出时,可利用选项 ConvolutionLayer[…][input] 来确定 ConvolutionLayer 的输入维度.
- 给定维度为 d1×…×di×… 的输入数组,则会得到维度为
×…×
×… 的输出数组,其中通道维度
=n,按照
来转换得到 di 的大小,其中
/
是 axis 的开头/结尾处的填充的大小,
是核的大小,
是步长,
是每个维度的膨胀因子. - Options[ConvolutionLayer] 给出构造层的默认选项列表. Options[ConvolutionLayer[…]] 提供用于在某些数据上运算网络层的默认选项列表.
- Information[ConvolutionLayer[…]] 提供有关该层的报告.
- Information[ConvolutionLayer[…],prop] 给出 ConvolutionLayer[…]的属性 prop 的值. 可能的属性与 NetGraph 相同.
范例
打开所有单元 关闭所有单元基本范例 (2)
创建一个有 2 个输出通道和核的大小为 4 的一维 ConvolutionLayer:
ConvolutionLayer[2, {4}]创建并初始化三维 ConvolutionLayer:
conv = NetInitialize@ConvolutionLayer[1, {2, 3, 4}, "Input" -> {1, 10, 10, 10}]conv[RandomReal[1, {1, 10, 10, 10}]]//Short范围 (13)
参数 (3)
创建一个具有三个输出通道和卷积核大小为 2×2 的 ConvolutionLayer:
ConvolutionLayer[3, {2, 2}]创建一个具有三个输出通道和卷积核大小为 2×2×2 的 ConvolutionLayer:
ConvolutionLayer[3, {2, 2, 2}]创建一个具有五个输出通道、七个输入通道和卷积核大小为 2×2 的 ConvolutionLayer:
ConvolutionLayer[5, 2, "Input" -> {7, Automatic, Automatic}]conv = NetInitialize@ConvolutionLayer[5, 2, "Input" -> {7, Automatic, Automatic}]conv[RandomReal[1, {7, 3, 3}]]//Dimensionsconv[RandomReal[1, {7, 6, 6}]]//Dimensions端口 (3)
创建初始化的二维 ConvolutionLayer;
conv = NetInitialize@ConvolutionLayer[1, 2, "Input" -> {1, 4, 4}]conv[RandomInteger[1, {1, 4, 4}]]Dimensions[%]创建一个初始化的三维 ConvolutionLayer,其中内核大小为 2:
conv = NetInitialize@ConvolutionLayer[1, 2, "Input" -> {1, 3, 3}]conv[{{{1, 1, 0}, {0, 0, 1}, {1, 1, 0}}}]创建初始化的二维 ConvolutionLayer,接受一个 RGB 图像,然后返回一个 RGB 图像:
conv = NetInitialize@ConvolutionLayer[3, 10, "Dilation" -> 3, "Input" -> NetEncoder["Image"], "Output" -> NetDecoder["Image"]]conv[[image]]ConvolutionLayer 自动线性作用于成批的输入:
conv[{[image], [image]}]参数 (7)
"Biases" (3)
创建无偏差的二维 ConvolutionLayer;
conv = ConvolutionLayer[2, {4, 4}, "Biases" -> None, "Input" -> {1, 40, 40}]创建具有单位内核的一维 ConvolutionLayer,将偏差应用于仅有的通道:
conv = ConvolutionLayer["Weights" -> {{{1}}}, "Biases" -> {0.5}]conv[{{1, 2, 3, 4, 5}}]创建具有单位内核的二维 ConvolutionLayer,将偏差应用于每个通道:
kernel = ArrayReshape[IdentityMatrix[3], {3, 3, 1, 1}];
conv = ConvolutionLayer["Weights" -> kernel, "Biases" -> {0.5, -0.5, 0.}, "Input" -> NetEncoder["Image"], "Output" -> NetDecoder["Image"]]conv[[image]]"Weights" (4)
创建一维 ConvolutionLayer,其核可对输入数组中的数据对进行平均处理:
conv = ConvolutionLayer["Weights" -> {{{0.5, 0.5}}}, "Biases" -> None]conv[{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}}] // Normal创建一个具有三个输入通道和一个输出通道的二维 ConvolutionLayer,并应用高斯模糊:
kernel = Table[GaussianMatrix[5], 1, 3];
conv = ConvolutionLayer["Weights" -> kernel, "Biases" -> None, "Input" -> NetEncoder["Image"], "Output" -> NetDecoder["Image"]]conv[[image]]创建一个由每个通道高斯核组成的二维 ConvolutionLayer. 首先创建核:
zero = ConstantArray[0, {19, 19}];
kernel = Table[If[i == j, GaussianMatrix[{9, 6 - 3i}], zero], {i, 0, 2}, {j, 0, 2}];Map[ArrayPlot[#, ImageSize -> 30]&, kernel, {2}]//GraphicsGridconv = ConvolutionLayer["Weights" -> kernel, "Biases" -> None, "Input" -> NetEncoder["Image"], "Output" -> NetDecoder["Image"]]conv[[image]]创建一个具有随机内核的二维 ConvolutionLayer:
kernel = RandomVariate[NormalDistribution[], {3, 3, 5, 5}];
conv = ConvolutionLayer["Weights" -> kernel, "Biases" -> None, "Input" -> NetEncoder["Image"], "Output" -> NetDecoder["Image"]]conv[[image]]选项 (12)
"ChannelGroups" (2)
创建具有三个通道组的二维 ConvolutionLayer:
conv = NetInitialize@ConvolutionLayer[6, {2, 2}, "ChannelGroups" -> 3, "Input" -> {9, 30, 30}]使用通道组将卷积权重的数量减少了等于组数的因子. 检查权重的维数:
Dimensions@NetExtract[conv, "Weights"]conv2 = NetInitialize@ConvolutionLayer[6, {2, 2}, "Input" -> {9, 30, 30}]Dimensions@NetExtract[conv2, "Weights"]创建一个具有 3 个通道组的随机二维 ConvolutionLayer:
conv = NetInitialize@ConvolutionLayer[3, {4, 4}, "ChannelGroups" -> 3, "Input" -> NetEncoder[ "Image"], "Output" -> NetDecoder["Image"]]Dimensions@NetExtract[conv, "Weights"]conv[[image]]//ImageAdjust"Dilation" (2)
给定维度上大小为 n 的膨胀因子实际上是对输入数组中相距为 n 的元素应用核:
创建膨胀因子为 2 的一维 ConvolutionLayer;
conv = ConvolutionLayer["Weights" -> {{{0.5, 0.5}}}, "Biases" -> None, "Dilation" -> 2]conv[{{0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0}}] // Normal创建膨胀因子为 5 的随机二维 ConvolutionLayer;
conv = NetInitialize@ConvolutionLayer[3, {3, 3}, "Dilation" -> 5, "Input" -> NetEncoder[ "Image"], "Output" -> NetDecoder["Image"]]conv[[image]]Interleaving (1)
创建一个 ConvolutionLayer,其中 InterleavingFalse 并有一个输入通道:
ConvolutionLayer[1, 5, "Input" -> {1, 25, 25}, Interleaving -> False]创建一个 ConvolutionLayer,其中 InterleavingTrue 并有一个输入通道:
ConvolutionLayer[1, 5, "Input" -> {25, 25, 1}, Interleaving -> True]PaddingSize (4)
创建一维 ConvolutionLayer,将邻接元素平均,并用 4 个零在各个边上填充:
conv = ConvolutionLayer["Weights" -> {{{0.5, 0.5}}}, "Biases" -> None, PaddingSize -> 4]conv[{{1, 2, 3, 4, 5}}] // Normal创建一个随机二维 ConvolutionLayer,用 10 个零对第一个维度的两侧进行填充,用 25 个零对第二个维度的两侧进行填充:
conv = NetInitialize[ConvolutionLayer[3, {3, 3}, PaddingSize -> {10, 25}, "Input" -> NetEncoder["Image"], "Output" -> NetDecoder["Image"]], RandomSeeding -> Automatic]conv[[image]]创建一个随机二维 ConvolutionLayer,用 10 个零对第一个维度的开头进行填充,用 20 个零对结尾进行填充:
conv = NetInitialize[ConvolutionLayer[3, {3, 3}, PaddingSize -> {{10, 20}, {0, 0}}, "Input" -> NetEncoder["Image"], "Output" -> NetDecoder["Image"]], RandomSeeding -> Automatic]conv[[image]]conv = ConvolutionLayer[1, 5, "Input" -> {1, 25, 25}, PaddingSize -> 2 ]"Stride" (3)
给定维度上大小为 n 的步长实际上是控制核在输入数组上移动的步长以产生输出数组.
创建一维 ConvolutionLayer,内核接受邻接数对的平均:
kernel = {{{0.5, 0.5}}};
conv = ConvolutionLayer["Weights" -> kernel, "Biases" -> None]conv[{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}}] // Normalconv = ConvolutionLayer["Weights" -> kernel, "Biases" -> None, "Stride" -> 2];
conv[{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}}] // Normalconv = ConvolutionLayer["Weights" -> kernel, "Biases" -> None, "Stride" -> 4];
conv[{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}}] // Normal创建具有不对称步幅的随机二维 ConvolutionLayer:
conv = ConvolutionLayer["Weights" -> RandomReal[0.1, {3, 3, 4, 4}], "Biases" -> None, "Stride" -> {3, 1}, "Input" -> NetEncoder["Image"], "Output" -> NetDecoder["Image"]]conv[[image]]conv1 = ConvolutionLayer[30, 7, "Input" -> {3, 500, 500}, "Stride" -> 1 ]conv2 = ConvolutionLayer[30, 7, "Input" -> {3, 500, 500}, "Stride" -> 7 ]data = RandomReal[1, {3, 500, 500}];
conv1 = NetInitialize@conv1;
conv2 = NetInitialize@conv2;
conv1[data];//AbsoluteTiming
conv2[data];//AbsoluteTiming属性和关系 (2)
给定输入的大小和参数,可以利用下列函数计算非通道维度 (non-channel) 的大小:
outputSize[inputSize_List, kernSize_, stride_, pad_, dilate_] := Floor[(inputSize + 2 * pad - (dilate * (kernSize - 1) + 1)) / stride] + 1输入的大小为 {256,252}、核的大小为 {2,3}、步长为 2、膨胀因子为 {3,4}、填充数量为 {1,2},计算输出的大小:
outputSize[{256, 252}, {2, 3}, 2, {1, 2}, {3, 4}]ConvolutionLayer 可用来计算二维卷积:
kernel = {{10, 1}, {1, 3}};
data = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
ConvolutionLayer[1, "Weights" -> {{kernel}}, "Biases" -> {0}][{data}]//First // Normal在逆转核以后,等价于 ListConvolve:
ListConvolve[Reverse[kernel, {1, 2}], data]可能存在的问题 (5)
ConvolutionLayer 已知其输入和输出的尺寸之前无法初始化:
NetInitialize@ConvolutionLayer[3, {2, 2}]NetInitialize@ConvolutionLayer[3, 2, "Input" -> {5, 23, 25}]ConvolutionLayer 不能接受符号输入:
conv = NetInitialize@ConvolutionLayer[1, {1, 1}, "Input" -> {1, 1, 1}];
conv[{{{1}}}]conv[{{{x}}}]ConvolutionLayer[3, {15, 15}, "Input" -> {3, 10, 10}]ConvolutionLayer[6, 2, "ChannelGroups" -> 3, "Input" -> {3, Automatic, Automatic}]ConvolutionLayer[6, 2, "ChannelGroups" -> 4, "Input" -> {3, Automatic, Automatic}]ConvolutionLayer 无法应用于输入大小不固定的批量输入:
conv = NetInitialize@ConvolutionLayer[3, {2, 2}, "Input" -> {2, Automatic, Automatic}];
conv[RandomReal[1, {2, 2, 3, 3}]]conv@{RandomReal[1, {2, 3, 3}], RandomReal[1, {2, 4, 4}]}技术笔记
相关指南
-
▪
- 神经网络 ▪
- 神经网络的创建和属性 ▪
- 神经网络层 ▪
- 机器学习 ▪
- 计算机视觉
文本
Wolfram Research (2016),ConvolutionLayer,Wolfram 语言函数,https://reference.wolfram.com/language/ref/ConvolutionLayer.html (更新于 2021 年).
CMS
Wolfram 语言. 2016. "ConvolutionLayer." Wolfram 语言与系统参考资料中心. Wolfram Research. 最新版本 2021. https://reference.wolfram.com/language/ref/ConvolutionLayer.html.
APA
Wolfram 语言. (2016). ConvolutionLayer. Wolfram 语言与系统参考资料中心. 追溯自 https://reference.wolfram.com/language/ref/ConvolutionLayer.html 年
BibTeX
@misc{reference.wolfram_2026_convolutionlayer, author="Wolfram Research", title="{ConvolutionLayer}", year="2021", howpublished="\url{https://reference.wolfram.com/language/ref/ConvolutionLayer.html}", note=[Accessed: 13-September-2026]}
BibLaTeX
@online{reference.wolfram_2026_convolutionlayer, organization={Wolfram Research}, title={ConvolutionLayer}, year={2021}, url={https://reference.wolfram.com/language/ref/ConvolutionLayer.html}, note=[Accessed: 13-September-2026]}