# [ML] 深度神經網路簡介 ###### tags: `ML` ## 什麼是深度神經網路 深度神經網路(Deep Neural Network,簡稱 DNN)是一種人工神經網路,它通過增加網絡的深度來提高其準確性。深度神經網路通過堆疊多個神經層來模擬人腦的神經網絡,並且可以處理各種不同的輸入,例如圖像、語音和文本。深度神經網路的表現能力非常強,它可以用來解決許多複雜的問題,例如自然語言理解和計算機視覺。 深度神經網路包含多層輸入層、隱藏層和輸出層,每層都含有權重和偏差。權重和偏差是一種能夠不斷迭代的數據,它們可以被訓練和更新,以優化模型的表現。 ![](https://hackmd.io/_uploads/BJbHbuEdi.png) ## 如何訓練 神經網路被訓練來學習特定函數,以有意義的輸出訊息,以對應於特定的輸入訊息,這個過程稱為訓練(trianing)。神經網路的訓練常常要依賴反向傳播(backpropagation)演算法,該演算法是一種機器學習演算法,它利用訊息之間的對比來確定參數值並調整權重和偏權。此外,學習步驟就是此種訓練演算法的一部分。最後,以資料輸入神經網路並計算輸出值,此輸出值可以與期望值(利用損失函數來計算)比對,針對比對結果調整權重和偏權,以期望使此神經網路功能更加完善。 1.首先,必須利用資料來初始化神經網路的權重和偏權,有時會使用均勻分佈。 2.接著,輸入單獨的資料到神經網路中,判斷該資料的結果,此結果將會被用於更新權重和偏權。 3.更新完權重和偏權之後,再次輸入單獨的資料到神經網路中,而該處理過程將會被重複進行,直到神經網路能夠有效完成分類等特定任務,訓練結束。 ## PyTorch實作 PyTorch是一個基於Python的開源深度學習框架,它可以用來構建、培訓和做深度神經網路。我們可以使用PyTorch去構建、訓練和推論深度神經網路。以下是使用PyTorch構建深度神經網路的步驟: 1. 定義一個神經網路模型:使用PyTorch提供的模型基礎構建,如簡單的全連接網路、卷積神經網路等。 2. 導入訓練數據:導入PyTorch提供的樣本或者自己輸入的樣本數據,以供模型訓練。 3. 初始化模型:對模型參數進行初始化,並定義損失函數和優化器,以便對參數進行更新。 4. 訓練模型:使用前述定義的損失函數和優化器,對參數進行更新,最終得到可以應用的模型。 ## 神經網路的種類 ### 全連結神經網路 全連結神經網路(Fully connected neural network),也叫做多層感知器(multi-layer perceptron),是一種常見的深度學習模型。它由輸入層、隱藏層和輸出層組成,其中每層的神經元都與前一層的所有神經元連接。輸入層接收原始資料,隱藏層對輸入進行處理並生成特徵表示,輸出層則根據特徵表示預測目標值。 ![](https://hackmd.io/_uploads/BJc-ZuNui.png) 這是一個簡單的 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 含有一種叫做卷積層的層,通過獨立地作用於輸入數據,將其映射到一個輸出矩陣。 卷積層由一系列濾波器組成,濾波器會獨立地對輸入陣列中的特徵進行捕捉,從而產生輸出矩陣。舉個例子,如果輸入是一張圖片,那麼卷積層可以檢測圖片中的特徵,比如線條、斜邊或其他代表圖案的元素。 ![](https://hackmd.io/_uploads/ByTMf_Ndo.png) CNN 同樣可以使用池化層來降低維度,池化層可以根據給定的參數,去除一些情況下不重要的輸出,可以降低計算量。 每個 CNN 都會包含一系列層,由一個或多個捲積層、池化層和一些全連接層 組成,最後會配上一個 Softmax 層。Softmax 層可以通過對神經網路輸出的結果進行簡單的標準化(輸出一個機率分布),用於二元分類和多元分類問題。 ![](https://hackmd.io/_uploads/ryQZMuVOo.png) 總而言之,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 ```