1、引言
小屌絲:魚哥, 看下這個流程圖,我沒看明白
小魚:啥流程圖。
小屌絲:你看,就是這個。
小魚:嗯,不錯,不錯。
小屌絲:能不能給我講一講這個?
小魚:你要了解CNN ?
小屌絲:CNN 是?
小魚:…你這… 深度學(xué)習(xí)知道嗎?
小屌絲:知道啊
小魚:你都知道深度學(xué)習(xí),還能不知道CNN
小屌絲: 哦,我還以為是…
小魚:我…
小屌絲:嘿嘿… 是我想多了
小魚:那你都知道CNN, 還想讓我說什么?
小屌絲:那就把CNN給我講透一些,讓我徹底愛上CNN
小魚: … 你真行。
2、卷積神經(jīng)網(wǎng)絡(luò)
2.1 定義
卷積神經(jīng)網(wǎng)絡(luò)是一種特殊的深度學(xué)習(xí)模型,它尤其適用于處理具有網(wǎng)格結(jié)構(gòu)的數(shù)據(jù),如圖像。
CNN通過一系列卷積層、池化層、全連接層等結(jié)構(gòu),對輸入數(shù)據(jù)進行層層轉(zhuǎn)換和抽象,從而提取出有用的特征信息,最終實現(xiàn)分類或識別等任務(wù)。
2.2 原理
CNN的核心思想在于局部感知和權(quán)值共享。
-
局部感知意味著每個神經(jīng)元只需對輸入數(shù)據(jù)的局部區(qū)域進行感知,而無需對全局進行感知。
- 這種局部連接的方式大大減少了模型的參數(shù)數(shù)量,降低了計算復(fù)雜度。
- 權(quán)值共享則意味著同一個卷積核在輸入數(shù)據(jù)的不同位置共享相同的權(quán)重,這進一步減少了模型的參數(shù)數(shù)量,提高了模型的泛化能力。
2.3 分類
CNN(卷積神經(jīng)網(wǎng)絡(luò))的分類算法多種多樣,它們大多基于CNN的基本結(jié)構(gòu)和原理,通過調(diào)整和優(yōu)化網(wǎng)絡(luò)結(jié)構(gòu)、參數(shù)設(shè)置以及訓(xùn)練策略,以應(yīng)對不同的分類任務(wù)和數(shù)據(jù)集。以下是一些主要的CNN分類算法:
-
AlexNet:這是2012年ImageNet競賽的冠軍模型,它首次在大規(guī)模圖像識別任務(wù)中展示了深度卷積神經(jīng)網(wǎng)絡(luò)的強大能力。
- AlexNet采用了8層神經(jīng)網(wǎng)絡(luò),包括5個卷積層和3個全連接層,使用了ReLU激活函數(shù)、數(shù)據(jù)增強、Dropout等技術(shù),顯著提高了分類性能。
-
VGGNet:VGGNet是牛津大學(xué)Visual Geometry Group提出的深度卷積神經(jīng)網(wǎng)絡(luò),它探索了網(wǎng)絡(luò)深度對性能的影響。
- VGGNet有多種配置,其中最常用的是VGG16和VGG19,它們分別包含16層和19層。
- VGGNet使用了較小的3x3卷積核和2x2池化核,通過堆疊多個卷積層來增加網(wǎng)絡(luò)深度,提高了模型的分類精度。
-
GoogleNet(InceptionNet):GoogleNet是Google團隊提出的深度卷積神經(jīng)網(wǎng)絡(luò),它采用了Inception模塊,該模塊通過并行使用不同大小的卷積核和池化操作來提取多尺度特征。
- GoogleNet還引入了輔助分類器來加速訓(xùn)練過程,并通過全局平均池化層來減少參數(shù)數(shù)量。
-
ResNet(殘差網(wǎng)絡(luò)):ResNet由微軟研究院提出,它解決了深度神經(jīng)網(wǎng)絡(luò)在訓(xùn)練過程中出現(xiàn)的梯度消失和表示瓶頸問題。
- ResNet通過引入殘差連接(shortcut connections)來允許梯度直接回流到較早的層,從而訓(xùn)練出更深的網(wǎng)絡(luò)。
- ResNet在多個圖像分類任務(wù)中取得了顯著的性能提升。
-
EfficientNet:EfficientNet是一種高效、可擴展的卷積神經(jīng)網(wǎng)絡(luò),它同時優(yōu)化了網(wǎng)絡(luò)深度、寬度和分辨率三個維度,以實現(xiàn)更好的性能和效率。
- EfficientNet采用了一種復(fù)合縮放方法,可以均勻地縮放網(wǎng)絡(luò)的所有維度,從而在保持模型復(fù)雜性的同時提高性能。
2.4 算法公式
CNN中的關(guān)鍵操作是卷積操作。對于二維輸入數(shù)據(jù)X和卷積核W,卷積操作的公式可以表示為:
s
(
i
,
j
)
=
(
X
?
W
)
(
i
,
j
)
=
∑
m
∑
n
x
(
i
+
m
,
j
+
n
)
w
(
m
,
n
)
s(i,j) = (X * W)(i,j) = ∑m∑n x(i+m,j+n)w(m,n)
s(i,j)=(X?W)(i,j)=∑m∑nx(i+m,j+n)w(m,n)
其中,
s
(
i
,
j
)
s(i,j)
s(i,j)表示輸出特征圖中位置(i,j)的像素值,
x
(
i
+
m
,
j
+
n
)
x(i+m,j+n)
x(i+m,j+n)表示輸入數(shù)據(jù)中位置
(
i
+
m
,
j
+
n
)
(i+m,j+n)
(i+m,j+n)的像素值,
w
(
m
,
n
)
w(m,n)
w(m,n)表示卷積核中位置
(
m
,
n
)
(m,n)
(m,n)的權(quán)重值。
2.5 代碼示例
# -*- coding:utf-8 -*-
# @Time : 2024-03-17
# @Author : Carl_DJ
import torch
import torch.nn as nn
import torch.nn.functional as F
# 定義一個名為ComplexCNN的卷積神經(jīng)網(wǎng)絡(luò)類,繼承自nn.Module
class ComplexCNN(nn.Module):
def __init__(self, num_classes=10):
super(ComplexCNN, self).__init__()
# 第一個卷積層,輸入通道數(shù)為3(彩色圖像),輸出通道數(shù)為64,卷積核大小為3x3,步長為1,填充為1
self.conv1 = nn.Conv2d(3, 64, kernel_size=3, stride=1, padding=1)
# 第二個卷積層,輸入通道數(shù)為64(上一個卷積層的輸出),輸出通道數(shù)為128,卷積核大小為3x3,步長為1,填充為1
self.conv2 = nn.Conv2d(64, 128, kernel_size=3, stride=1, padding=1)
# 第三個卷積層,輸入通道數(shù)為128,輸出通道數(shù)為256,卷積核大小為3x3,步長為1,填充為1
self.conv3 = nn.Conv2d(128, 256, kernel_size=3, stride=1, padding=1)
# 最大池化層,池化核大小為2x2,步長為2
self.pool = nn.MaxPool2d(kernel_size=2, stride=2)
# Dropout層,用于防止過擬合
self.dropout = nn.Dropout(0.5)
# 全連接層,輸入特征數(shù)為flatten后的特征數(shù)量,輸出特征數(shù)為512
self.fc1 = nn.Linear(self._get_flatten_size(256, 7, 7), 512)
# 輸出層,全連接層,輸入特征數(shù)為512,輸出特征數(shù)為分類的類別數(shù)
self.fc2 = nn.Linear(512, num_classes)
# 輔助函數(shù),用于計算flatten后的特征數(shù)量
def _get_flatten_size(self, ch, w, h):
return ch * w * h
# 前向傳播函數(shù)
def forward(self, x):
# 卷積 + ReLU激活函數(shù) + 最大池化
x = self.pool(F.relu(self.conv1(x)))
x = self.pool(F.relu(self.conv2(x)))
x = self.pool(F.relu(self.conv3(x)))
# 展平操作,將多維的特征圖轉(zhuǎn)換為一維向量,方便輸入全連接層
x = torch.flatten(x, 1)
# Dropout層,防止過擬合
x = self.dropout(x)
# 全連接層 + ReLU激活函數(shù)
x = F.relu(self.fc1(x))
# 再次使用Dropout層
x = self.dropout(x)
# 輸出層,使用softmax函數(shù)進行多分類
x = F.log_softmax(self.fc2(x), dim=1)
return x
# 實例化模型,假設(shè)有10個分類
model = ComplexCNN(num_classes=10)
# 打印模型結(jié)構(gòu)
print(model)
# 假設(shè)輸入一個batch的圖像數(shù)據(jù),大小為(batch_size, 3, 32, 32)
# 其中batch_size是批處理大小,3是圖像通道數(shù)(RGB),32x32是圖像大小
input_data = torch.randn(64, 3, 32, 32) # 假設(shè)batch_size為64
# 將模型設(shè)置為訓(xùn)練模式
model.train()
# 前向傳播,得到輸出
output = model(input_data)
# 輸出維度為(batch_size, num_classes),即每個樣本在每個類別上的預(yù)測概率分布
print(output.shape) # 應(yīng)輸出torch.Size([64, 10])
代碼解析:
-
類定義:ComplexCNN 類繼承自 nn.Module,這是所有神經(jīng)網(wǎng)絡(luò)模塊的基類。
-
卷積層:我們定義了三個卷積層 self.conv1、self.conv2 和 self.conv3,分別使用不同數(shù)量的輸出通道(即卷積核數(shù)量)。每個卷積層都使用了ReLU激活函數(shù)和最大池化層來減小特征圖的空間尺寸,增加特征的抽象性。
-
池化層:self.pool 是一個最大池化層,用于減小特征圖的大小,并保留最重要的特征。
-
Dropout層:self.dropout 用于在前向傳播過程中隨機將一部分神經(jīng)元的輸出置零,防止模型過擬合。
-
全連接層:self.fc1 和 self.fc2 是全連接層,用于將卷積層提取的特征整合成最終的分類結(jié)果。self.fc1 接收flatten后的特征向量,self.fc2 輸出每個類別的預(yù)測概率。
-
輔助函數(shù):_get_flatten_size 用于計算flatten后的特征數(shù)量,這對于定義全連接層的輸入大小是必要的。
-
前向傳播函數(shù):forward 方法定義了數(shù)據(jù)通過網(wǎng)絡(luò)的前向傳播過程。每個卷積層后面都跟隨了ReLU激活函數(shù)和最大池化層,之后是flatten操作,然后是全連接層和最終的softmax輸出。
-
實例化模型:我們創(chuàng)建了一個 ComplexCNN 的實例,并指定了分類的類別數(shù)。
-
前向傳播示例:我們創(chuàng)建了一個隨機的輸入數(shù)據(jù) input_data,模擬了一個batch的圖像數(shù)據(jù),并通過模型進行了前向傳播,得到了輸出 output。輸出是一個二維張量,其形狀為 (batch_size, num_classes),表示每個樣本在每個類別上的預(yù)測概率分布。
3、總結(jié)
卷積神經(jīng)網(wǎng)絡(luò)作為深度學(xué)習(xí)中的代表性算法,以其強大的特征提取和分類能力在計算機視覺領(lǐng)域取得了顯著的成功。
通過局部感知和權(quán)值共享的原理,CNN有效地減少了模型的參數(shù)數(shù)量,提高了計算效率。
同時,通過卷積層、池化層、全連接層等結(jié)構(gòu)的組合,CNN能夠自動學(xué)習(xí)輸入數(shù)據(jù)的特征表示,實現(xiàn)對輸入數(shù)據(jù)的高效分類和識別。
我是小魚:文章來源:http://www.zghlxwxcb.cn/news/detail-845719.html
- CSDN 博客專家;
- 阿里云 專家博主;
- 51CTO博客專家;
- 企業(yè)認證金牌面試官;
- 多個名企認證&特邀講師等;
- 名企簽約職場面試培訓(xùn)、職場規(guī)劃師;
- 多個國內(nèi)主流技術(shù)社區(qū)的認證專家博主;
- 多款主流產(chǎn)品(阿里云等)測評一、二等獎獲得者;
關(guān)注小魚,學(xué)習(xí)機器學(xué)習(xí)領(lǐng)域的知識。文章來源地址http://www.zghlxwxcb.cn/news/detail-845719.html
到了這里,關(guān)于【深度學(xué)習(xí)】最強算法之:卷積神經(jīng)網(wǎng)絡(luò)(CNN)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!