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