深度學(xué)習(xí) | 學(xué)習(xí)第一個(gè)卷積神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)
Hey 朋友,點(diǎn)擊藍(lán)字關(guān)注嗎?
深度學(xué)習(xí)
學(xué)習(xí)第一個(gè)卷積神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)
Hi~ 大家好。
今天學(xué)習(xí)了第一個(gè)深度學(xué)習(xí)的小程序,為了加深理解,對(duì)程序進(jìn)行了逐行解析,并在此進(jìn)行記錄分享,歡迎感興趣的朋友一起討論學(xué)習(xí)。
# 1
先給出完整程序:
import torch.nn as nnimport torch.nn.functional as F
class Net(nn.Module):def __init__(self):# nn.Module子類的函數(shù)必須在構(gòu)造函數(shù)中執(zhí)行父類的構(gòu)造函數(shù)# 下式等價(jià)于nn.Module.__init__(self)super(Net, self).__init__()
# 卷積層 '1'表示輸入圖片為單通道, '6'表示輸出通道數(shù),'5'表示卷積核為5*5self.conv1 = nn.Conv2d(1, 6, 5)# 卷積層self.conv2 = nn.Conv2d(6, 16, 5)# 仿射層/全連接層,y = Wx + bself.fc1 = nn.Linear(16*5*5, 120)self.fc2 = nn.Linear(120, 84)self.fc3 = nn.Linear(84, 10)
def forward(self, x):# 卷積 -> 激活x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))x = F.max_pool2d(F.relu(self.conv2(x)), 2)# reshape,‘-1’表示自適應(yīng)x = x.view(x.size()[0], -1)x = F.relu(self.fc1(x))x = F.relu(self.fc2(x))x = self.fc3(x)return x
net = Net()print(net)
# 2
下面進(jìn)行程序分析:
首先導(dǎo)入必需的庫(kù)
import torch.nn as nnimport torch.nn.functional as F
torch.nn: 這個(gè)模塊包含了構(gòu)建神經(jīng)網(wǎng)絡(luò)所需的所有構(gòu)件,比如層結(jié)構(gòu)(線性層、卷積層等)和一些激活函數(shù)。每個(gè)模塊都是nn.Module的子類,并且是為了方便模型構(gòu)建而抽象出的高級(jí)接口。
torch.nn.functional: 提供了一些函數(shù)式的接口,用于直接對(duì)輸入進(jìn)行操作,如激活函數(shù)(ReLU等)、池化函數(shù)等。這些函數(shù)通常是無(wú)狀態(tài)的,即不包含可訓(xùn)練參數(shù)。
定義神經(jīng)網(wǎng)絡(luò)
class Net(nn.Module):
這里定義了一個(gè)名為Net的類,它繼承自nn.Module。在PyTorch中,自定義的網(wǎng)絡(luò)模型都應(yīng)該繼承自nn.Module類,這個(gè)基類提供了模型需要的大部分功能,如參數(shù)管理、模型保存與加載等。
構(gòu)造函數(shù)
def __init__(self):super(Net, self).__init__()
在Net的構(gòu)造函數(shù)中,首先調(diào)用super(Net, self).__init__()以確保父類nn.Module的構(gòu)造函數(shù)被正確執(zhí)行。這是初始化繼承自其他Python類的自定義類的標(biāo)準(zhǔn)做法。
定義層結(jié)構(gòu)
self.conv1 = nn.Conv2d(1, 6, 5)self.conv2 = nn.Conv2d(6, 16, 5)self.fc1 = nn.Linear(16*5*5, 120)self.fc2 = nn.Linear(120, 84)self.fc3 = nn.Linear(84, 10)
self.conv1和self.conv2定義了兩個(gè)卷積層。nn.Conv2d的參數(shù)分別代表輸入通道數(shù)、輸出通道數(shù)和卷積核的尺寸。例如,self.conv1接收單通道圖像,輸出6個(gè)通道的特征映射,使用5x5的卷積核。
self.fc1, self.fc2, self.fc3定義了三個(gè)全連接層(也稱線性層)。nn.Linear的參數(shù)分別代表輸入特征數(shù)和輸出特征數(shù)。例如,self.fc1接收1655大小的輸入(來(lái)自前一層的輸出),并輸出120個(gè)特征。
前向傳播
def forward(self, x)
:
forward函數(shù)定義了數(shù)據(jù)通過(guò)網(wǎng)絡(luò)的方式。x是輸入數(shù)據(jù)。
解釋
x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))x = F.max_pool2d(F.relu(self.conv2(x)), 2)x = x.view(x.size()[0], -1)x = F.relu(self.fc1(x))x = F.relu(self.fc2(x))x = self.fc3(x)
在每個(gè)卷積層后,使用ReLU函數(shù)作為激活函數(shù),隨后應(yīng)用最大池化(F.max_pool2d)以減少特征維度和增強(qiáng)模型的泛化能力。池化層的參數(shù)指定了池化窗口的大小。
x.view(x.size()[0], -1)這行代碼將多維特征圖轉(zhuǎn)換(或稱為扁平化)為一維向量,以便全連接層可以處理。這是從卷積層到全連接層過(guò)渡的常見做法。
數(shù)據(jù)通過(guò)全連接層序列,其中前兩層使用ReLU激活函數(shù),最后一層的輸出可以用于計(jì)算分類任務(wù)的概率分布(通常在此之后會(huì)加上Softmax層進(jìn)行多分類問(wèn)題的概率輸出)。
總結(jié):這個(gè)網(wǎng)絡(luò)架構(gòu)是一個(gè)經(jīng)典的卷積神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),適合處理圖像數(shù)據(jù)。通過(guò)兩個(gè)卷積層提取空間特征,然后通過(guò)全連接層進(jìn)行分類。每一層都有其特定的作用和配置,例如卷積層用于提取圖像特征,全連接層用于將這些特征映射到最終的輸出類別。這種結(jié)構(gòu)的網(wǎng)絡(luò)在圖像識(shí)別、分類任務(wù)中非常有效。
聲明:轉(zhuǎn)載或者引用本文內(nèi)容請(qǐng)聯(lián)系本文作者。
- end -
視覺(jué)選型|機(jī)器人選型|手眼標(biāo)定
圖像處理|視覺(jué)軟件開發(fā)|案例應(yīng)用分享
