Flux.jl 是包含卷积神经网络的, 但是官方API文件中没有给出一个完整的程序框架, 只是对所需神经元给了局部解释, 此外对 model-zoo 模型动物园中的案例没有及时跟着 Flux.jl 的版本更新, 也无法运行出来结果。 因此本文搭建了一个完整可训练的卷积神经网络。
Conv 卷积算子
Conv: 卷积操作,用于特征提取。
ConvTranspose: 转置卷积操作,用于上采样。
DepthwiseConv: 深度可分卷积,每个输入通道单独卷积。
DepthwiseConvDims: 深度可分卷积的维度。
DenseConvDims: 密集卷积的维度。
ConvDims: 卷积的维度。
以 Conv 为例
Conv(filter, in => out, σ = identity;stride = 1, pad = 0, dilation = 1, groups = 1, [bias, init])
Conv(weight, [bias, activation; stride, pad, dilation])
标准卷积层。filter是一个整数元组,指定卷积核的大小;in和out分别指定输入和输出通道的数量。
图像数据应存储在WHCN顺序(宽度、高度、通道、批次)中。换句话说,一个100×100的RGB图像将是一个100×100×3×1的数组,而50个批次将是一个100×100×3×50的数组。这具有N=2的空间维度,需要一个像(5,5)这样的核尺寸,一个整数元组。
要在N个特征维度上执行卷积,此层期望输入一个数组,其中ndims(x) == N+2,其中size(x, N+1) == in是输入通道的数量,而size(x, ndims(x))(始终)是批次中观察值的数量。然后:
• filter应是一个包含N个整数的元组。
• 关键字stride和dilation每个都应是一个单个整数,或者是一个包含N个整数的元组。
• 关键字pad指定在数据数组边界上添加的元素数量。它可以是一个:
- 整数,表示在所有边界上应用相同的填充,
- 包含N个整数的元组,以在每个空间维度的开始/结束处应用相同的填充,
- 包含2*N个整数的元组,用于非对称填充,
- 单例SamePad(),用于计算填充,使得size(output,d) == size(x,d) / stride(可能四舍五入)对于每个空间维度。
• 关键字groups预期是一个Int。它指定将卷积划分为多少组。
用于控制层初始化的关键字:
• init - 用于生成初始权重的函数。默认为glorot_uniform。
• bias - 初始偏置向量默认为全零。可以通过将此设置为false来完全禁用可训练偏置,或者可以提供另一个向量,如bias = randn(Float32, out)。
构造函数的第二种形式允许您传入预先构建的权重矩阵和偏置向量。这在您想要自己初始化权重时很有用。
Conv 官方API案例解读
这段代码是使用Julia编程语言和Flux机器学习库来创建和操作卷积神经网络(CNN)的层。下面是对每行代码的解释:
julia> xs = rand(Float32, 100, 100, 3, 50); # a batch of 50 RGB images
这行代码创建了一个名为xs
的四维数组,它代表一个包含50张100x100像素的RGB图像的批次。每个像素由3个值表示(红、绿、蓝),因此数组的大小是100x100x3x50。
julia> layer