### 卷積層神經網路
卷積層神經網路(Convolutional Neural Network, CNN)是一種深度學習模型,主要應用於影像辨識、圖像分類等領域。它通過卷積運算和池化運算對影像進行特徵提取,再透過全連接層進行分類。
卷積運算是指利用卷積核(又稱為濾波器)對圖像進行卷積運算,提取圖像中的特徵。卷積核通常是一個小型的矩陣,矩陣中的每個元素都代表一個權重。將卷積核應用於圖像中,可以得到一個特徵圖,特徵圖中的每個元素代表圖像中的一個特徵點。
池化運算是指對特徵圖進行降維運算,減少計算量,同時也可以防止過擬合。常見的池化運算有最大池化和平均池化。最大池化是取一個區域中的最大值作為該區域的特徵值,平均池化是取一個區域中的平均值作為該區域的特徵值。
卷積層通常包含多個卷積核,每個卷積核提取一種特徵。通過卷積運算和池化運算,可以得到多個特徵圖,每個特徵圖代表一種特徵。這些特徵圖經過拼接,再透過全連接層進行分類,就可以得到影像的分類結果。
卷積層的 kernel size 指的是卷積核的大小,也可以稱為 filter size,是指在一次卷積運算中卷積核的大小,通常使用正方形,例如 (3, 3) 或 (5, 5)。
卷積核是一個矩陣,通常是由隨機初始值初始化,卷積運算中每個卷積核的大小決定了神經網路在提取特徵時的感受野大小。在卷積層中,神經網路通過將卷積核與輸入的圖像進行卷積,從而提取圖像中的特徵。卷積核的大小也決定了神經網路提取特徵的細節度,比如 (3, 3) 卷積核通常用於提取局部特徵,而 (5, 5) 卷積核則用於提取更大範圍的特徵。
通常,卷積核的大小和神經網路的深度有關,越深的神經網路需要更大的卷積核。然而,過大的卷積核可能會導致過擬合或計算過度,因此通常需要經過調試和優化。
在卷積層中,Padding 是指在輸入的邊緣周圍添加一些額外的值,以便輸出的大小與輸入大小相同。Padding 的主要目的是保持特徵圖(Feature Map)的大小不變,以便在網絡的不同層之間傳遞信息。通常,padding 被添加在輸入圖像的邊緣,以便濾波器在邊緣的像素點也能夠進行卷積運算,從而獲得更好的特徵提取結果。有兩種 padding 的方式:same padding 和 valid padding。same padding 是在輸入的圖像邊緣上添加額外的 padding 像素,以保持輸入和輸出的大小相同;valid padding 則是不添加 padding 像素,輸出大小會小於輸入大小。
在卷積層中,stride是指每次卷積過程中,filter/kernel(卷積核)在input(輸入)的滑動步長。以二維輸入和卷積核為例,stride=1時,卷積核每次向右移動一列;stride=2時,卷積核每次向右移動兩列,依此類推。stride的設置可以影響輸出的尺寸和計算量。較小的stride可以增加計算量但是保留更多的空間信息,而較大的stride可以節省計算量但是可能會丟失一些細節信息。
```java
import org.deeplearning4j.nn.conf.*;
import org.deeplearning4j.nn.conf.layers.*;
import org.deeplearning4j.nn.multilayer.*;
import org.nd4j.linalg.activations.Activation;
import org.nd4j.linalg.learning.config.Adam;
import org.nd4j.linalg.lossfunctions.LossFunctions;
public class ConvolutionalNetworkExample {
public static void main(String[] args) {
int nChannels = 1; // 頻道數
int outputNum = 10; // 輸出數量
int batchSize = 64; // 批次大小
int nEpochs = 10; // 迭代次數
MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder()
.seed(123)
.optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT)
.updater(new Adam(0.05))
.list()
.layer(new ConvolutionLayer.Builder(5, 5)
.nIn(nChannels)
.stride(1, 1)
.nOut(20)
// Activation.IDENTITY代表恆等函數,即輸入等於輸出,沒有任何激活函數的作用。
.activation(Activation.IDENTITY)
.build())
.layer(new SubsamplingLayer.Builder(SubsamplingLayer.PoolingType.MAX)
.kernelSize(2, 2)
.stride(2, 2)
.build())
.layer(new ConvolutionLayer.Builder(5, 5)
.stride(1, 1)
.nOut(50)
.activation(Activation.IDENTITY)
.build())
.layer(new SubsamplingLayer.Builder(SubsamplingLayer.PoolingType.MAX)
.kernelSize(2, 2)
.stride(2, 2)
.build())
.layer(new DenseLayer.Builder().activation(Activation.RELU)
.nOut(500).build())
.layer(new OutputLayer.Builder(LossFunctions.LossFunction.NEGATIVELOGLIKELIHOOD)
.nOut(outputNum)
.activation(Activation.SOFTMAX)
.build())
.setInputType(InputType.convolutionalFlat(28, 28, nChannels))
.build();
MultiLayerNetwork model = new MultiLayerNetwork(conf);
model.init();
// 訓練資料
DataSetIterator mnistTrain = new MnistDataSetIterator(batchSize, true, 12345);
// 測試資料
DataSetIterator mnistTest = new MnistDataSetIterator(batchSize, false, 12345);
for (int i = 0; i < nEpochs; i++) {
model.fit(mnistTrain);
System.out.println("Epoch " + i + " complete");
}
Evaluation eval = new Evaluation(outputNum);
while (mnistTest.hasNext()) {
DataSet ds = mnistTest.next();
INDArray output = model.output(ds.getFeatures(), false);
eval.eval(ds.getLabels(), output);
}
System.out.println(eval.stats());
}
}
```
SubsamplingLayer是神經網路中的一種層,通常用於卷積神經網路的下採樣(Downsampling)操作。在卷積神經網路中,每次卷積操作都會導致圖像尺寸的縮小,為了防止信息流失,需要在卷積操作之間插入下採樣操作,降低圖像尺寸,同時保留重要特徵。SubsamplingLayer.Builder可以用來建立SubsamplingLayer。
SubsamplingLayer.Builder的常用方法如下:
* poolingType(PoolingType poolingType):設置下採樣的方式,可選擇最大池化(MAX)或平均池化(AVG)。
* kernelSize(int... kernelSize):設置下採樣窗口的大小,即池化區域的大小。對於2D圖像數據,kernelSize通常為2個整數,分別表示高度和寬度。
* stride(int... stride):設置池化操作的步長,即池化區域每次移動的距離。對於2D圖像數據,stride通常為2個整數,分別表示高度和寬度。
* padding(int... padding):設置輸入數據的邊緣填充大小。對於2D圖像數據,padding通常為2個整數,分別表示高度和寬度。可以在下採樣操作之前進行填充,以便更好地保留邊緣特徵。
常見的池化層參數組合包括:
1. Max pooling: kernel size = 2x2,stride = 2
1. Average pooling: kernel size = 2x2,stride = 2
1. Global max pooling: kernel size = input size,stride = input size
1. Global average pooling: kernel size = input size,stride = input size
其中,Max pooling 和 Average pooling 是最常見的池化層參數組合,Global max pooling 和 Global average pooling 常用於圖像分類任務的最後一層,可以將特徵圖轉換為一個向量進行分類。具體的參數選擇還要根據具體的任務和數據集來進行調整。