# [ML] 深度神經網路簡介
###### tags: `ML`
## 什麼是深度神經網路
深度神經網路(Deep Neural Network,簡稱 DNN)是一種人工神經網路,它通過增加網絡的深度來提高其準確性。深度神經網路通過堆疊多個神經層來模擬人腦的神經網絡,並且可以處理各種不同的輸入,例如圖像、語音和文本。深度神經網路的表現能力非常強,它可以用來解決許多複雜的問題,例如自然語言理解和計算機視覺。
深度神經網路包含多層輸入層、隱藏層和輸出層,每層都含有權重和偏差。權重和偏差是一種能夠不斷迭代的數據,它們可以被訓練和更新,以優化模型的表現。

## 如何訓練
神經網路被訓練來學習特定函數,以有意義的輸出訊息,以對應於特定的輸入訊息,這個過程稱為訓練(trianing)。神經網路的訓練常常要依賴反向傳播(backpropagation)演算法,該演算法是一種機器學習演算法,它利用訊息之間的對比來確定參數值並調整權重和偏權。此外,學習步驟就是此種訓練演算法的一部分。最後,以資料輸入神經網路並計算輸出值,此輸出值可以與期望值(利用損失函數來計算)比對,針對比對結果調整權重和偏權,以期望使此神經網路功能更加完善。
1.首先,必須利用資料來初始化神經網路的權重和偏權,有時會使用均勻分佈。
2.接著,輸入單獨的資料到神經網路中,判斷該資料的結果,此結果將會被用於更新權重和偏權。
3.更新完權重和偏權之後,再次輸入單獨的資料到神經網路中,而該處理過程將會被重複進行,直到神經網路能夠有效完成分類等特定任務,訓練結束。
## PyTorch實作
PyTorch是一個基於Python的開源深度學習框架,它可以用來構建、培訓和做深度神經網路。我們可以使用PyTorch去構建、訓練和推論深度神經網路。以下是使用PyTorch構建深度神經網路的步驟:
1. 定義一個神經網路模型:使用PyTorch提供的模型基礎構建,如簡單的全連接網路、卷積神經網路等。
2. 導入訓練數據:導入PyTorch提供的樣本或者自己輸入的樣本數據,以供模型訓練。
3. 初始化模型:對模型參數進行初始化,並定義損失函數和優化器,以便對參數進行更新。
4. 訓練模型:使用前述定義的損失函數和優化器,對參數進行更新,最終得到可以應用的模型。
## 神經網路的種類
### 全連結神經網路
全連結神經網路(Fully connected neural network),也叫做多層感知器(multi-layer perceptron),是一種常見的深度學習模型。它由輸入層、隱藏層和輸出層組成,其中每層的神經元都與前一層的所有神經元連接。輸入層接收原始資料,隱藏層對輸入進行處理並生成特徵表示,輸出層則根據特徵表示預測目標值。

這是一個簡單的 PyTorch 全連結神經網路實作示例:
```python=
import torch
import torch.nn as nn
# 定義模型
class Network(nn.Module):
def __init__(self):
super(Network, self).__init__()
# 全連結層,Input 長度為 784,Output 長度為 10
self.fc_layer = nn.Linear(784, 10)
# 前饋函數
def forward(self, x):
out = self.fc_layer(x)
return out
# 創建神經網路
model = Network()
# 將參數定義為需要更新的變量
params = list(model.parameters())
# 定義 Loss 函數
optimizer = torch.optim.Adam(params, lr = 0.01)
# 訓練模型
for i in range(100):
#... 其他前置作業
# 計算模型輸出結果
outputs = model(inputs)
# 計算損失
loss = criterion(outputs, targets)
# 反向傳播
loss.backward()
# 梯度下降
optimizer.step()
```
### 捲積神經網路
捲積神經網路 (CNN) 是一個典型的深度學習技術,可以用於處理各種複雜的信息,如識別圖像、語音、文字等。它可以將輸入信息映射到一個輸出矩陣,其中包含通過複雜的卷積操作來提取的特徵。
CNN 含有一種叫做卷積層的層,通過獨立地作用於輸入數據,將其映射到一個輸出矩陣。
卷積層由一系列濾波器組成,濾波器會獨立地對輸入陣列中的特徵進行捕捉,從而產生輸出矩陣。舉個例子,如果輸入是一張圖片,那麼卷積層可以檢測圖片中的特徵,比如線條、斜邊或其他代表圖案的元素。

CNN 同樣可以使用池化層來降低維度,池化層可以根據給定的參數,去除一些情況下不重要的輸出,可以降低計算量。
每個 CNN 都會包含一系列層,由一個或多個捲積層、池化層和一些全連接層 組成,最後會配上一個 Softmax 層。Softmax 層可以通過對神經網路輸出的結果進行簡單的標準化(輸出一個機率分布),用於二元分類和多元分類問題。

總而言之,CNN 是一個利用卷積操作來擷取特徵的技術,可以獨立地作用於輸入數據,並且可以配合池化層和全連接層來獲得最終的分類結果。
```python=
import torch
import torch.nn as nn
class SimpleConvNet(nn.Module):
def __init__(self):
super(SimpleConvNet, self).__init__()
# kernel size=3, stride=1
self.conv1 = nn.Conv2d(3, 8, 3, padding=1)
self.conv2 = nn.Conv2d(8, 16, 3, padding=1)
self.conv3 = nn.Conv2d(16, 32, 3, padding=1)
self.fc1 = nn.Linear(32 * 4 * 4, 128)
self.fc2 = nn.Linear(128, 10)
self.activation = nn.ReLU()
self.maxpool = nn.MaxPool2d(2, 2)
self.softmax = nn.Softmax(dim=1)
def forward(self, x):
x = self.activation(self.conv1(x))
x = self.maxpool(x)
x = self.activation(self.conv2(x))
x = self.maxpool(x)
x = self.activation(self.conv3(x))
x = self.maxpool(x)
x = x.view(-1, 32 * 4 * 4)
x = self.activation(self.fc1(x))
x = self.fc2(x)
x = self.softmax(x)
return x
```