Python深度學習之實現卷積神經網絡
一、卷積神經網絡
Yann LeCun 和Yoshua Bengio在1995年引入瞭卷積神經網絡,也稱為卷積網絡或CNN。CNN是一種特殊的多層神經網絡,用於處理具有明顯網格狀拓撲的數據。其網絡的基礎基於稱為卷積的數學運算。
卷積神經網絡(CNN)的類型
以下是一些不同類型的CNN:
- 1D CNN:1D CNN 的輸入和輸出數據是二維的。一維CNN大多用於時間序列。
- 2D CNNN:2D CNN的輸入和輸出數據是三維的。我們通常將其用於圖像數據問題。
- 3D CNNN:3D CNN的輸入和輸出數據是四維的。一般在3D圖像上使用3D CNN,例如MRI(磁共振成像),CT掃描(甲CT掃描或計算機斷層掃描(以前稱為計算機軸向斷層或CAT掃描)是一種醫學成像 技術中使用的放射學獲得用於非侵入性詳述的身體的圖像診斷的目的)和其他復雜應用程序的DICOM圖像(醫學數字成像)
二、網絡架構
以下是CNN中不同層的網絡架構:
- 卷積層
- 池化層
- 全連接層
CNN架構的完整概述
三、卷積
卷積是對名為f
和g
的兩個函數的數學計算,得出第三個函數(f * g)
。第三個功能揭示瞭一個形狀如何被另一個形狀修改。其數學公式如下:
h ( x , y ) = f ( x , y ) ∗ g ( x , y ) h(x,y)=f(x,y)*g(x,y) h(x,y)=f(x,y)∗g(x,y)
卷積有幾個非常重要的概念:遮罩。
圖中的黃色的部分的就是遮罩
四、卷積層
卷積層是CNN的核心構建塊。CNN是具有一些卷積層和其他一些層的神經網絡。卷積層具有幾個進行卷積運算的過濾器。卷積層應用於二維輸入,由於其出色的圖像分類工作性能而非常著名。它們基於具有二維輸入的小核k的離散卷積,並且該輸入可以是另一個卷積層的輸出。
五、在Keras中構建卷積層
from keras.models import Sequential from keras.layers.convolutional import Conv2D model = Sequential() model.add(Conv2D(32, (3, 3), input_shape=(32, 32, 3), padding='same', activation='relu'))
上面的代碼實現說明:
- 輸出將具有32個特征圖。
- 內核大小將為3×3。
- 輸入形狀為32×32,帶有三個通道。
- padding = same。這意味著需要相同尺寸的輸出作為輸入。
- 激活指定激活函數。
接下來,使用不同的參數值構建一個卷積層,如下所示
六、池化層
池化層它的功能是減少參數的數量,並減小網絡中的空間大小。我們可以通過兩種方式實現池化:
- Max Pooling:表示矩形鄰域內的最大輸出。Average Pooling:表示矩形鄰域的平均輸出
- Max Pooling和Average Pooling減少瞭圖像的空間大小,提供瞭更少的特征和參數以供進一步計算。
上圖顯示瞭帶有步幅為2的2X2濾波器的MaxPool池化層。
在Keras中實現Max Pool層,如下所示:
model.add(MaxPooling2D(pool_size =(2,2)))
七、全連接層
全連接層是確定最終預測的所有輸入和權重的總和,代表最後一個合並層的輸出。它將一層中的每個神經元連接到另一層中的每個神經元
全連接層的主要職責是進行分類。它與softmax激活函數一起使用以得到結果。
用於多類的激活函數是softmax函數,該函數以0和1(總計為1)的概率對完全連接的層進行規范化。
帶有非線性函數“ Softmax”的Keras代碼如下:
model.add(Dense(10, activation='softmax'))
八、Python實現卷積神經網絡
環境Google Colab
導入所有必需的庫
import numpy as np import pandas as pd from keras.optimizers import SGD from keras.datasets import cifar10 from keras.models import Sequential from keras.utils import np_utils as utils from keras.layers import Dropout, Dense, Flatten from keras.layers.convolutional import Conv2D, MaxPooling2D
加載cifar10數據:
(X, y), (X_test, y_test) = cifar10.load_data() # 規范化數據 X,X_test = X.astype('float32')/ 255.0,X_test.astype('float32')/ 255.0
轉換為分類:
y,y_test = utils.to_categorical(y,10),u.to_categorical(y_test,10)
初始化模型:
model = Sequential()
使用以下參數添加卷積層:
- Features map = 32
- 內核大小= 3×3
- 輸入形狀= 32×32
- Channels = 3
- Padding = 3→表示與輸入相同的尺寸輸出
model.add(Conv2D(32, (3, 3), input_shape=(32, 32, 3), padding='same', activation='relu')) # Dropout model.add(Dropout(0.2)) # 添加另一個卷積層 padding ='valid'表示輸出尺寸可以采用任何形式 model.add(Conv2D(32,(3,3),activation ='relu',padding ='valid')) # 添加一個最大池化層 model.add(MaxPooling2D(pool_size =(2,2))) # 展平 model.add(Flatten()) # Dense層 隱藏單元數為521 model.add(Dense(512, activation='relu')) # Dropout model.add(Dropout(0.3)) #output model.add(Dense(10, activation='softmax')) # 編譯模型 激活器選擇SGD model.compile(loss='categorical_crossentropy', optimizer=SGD(momentum=0.5, decay=0.0004), metrics=['accuracy'])
25個epochs
model.fit(X, y, validation_data=(X_test, y_test), epochs=25, batch_size=512)
九、總結
卷積神經網絡是一種特殊的多層神經網絡,主要用於提取特征。CNN使用稱為卷積和池化的兩個操作將圖像縮小為其基本特征,並使用這些特征適當地理解和分類圖像
到此這篇關於Python深度學習之實現卷積神經網絡的文章就介紹到這瞭,更多相關Python實現卷積神經網絡內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Python MNIST手寫體識別詳解與試練
- python之tensorflow手把手實例講解斑馬線識別實現
- 由淺入深學習TensorFlow MNIST 數據集
- Python神經網絡TensorFlow基於CNN卷積識別手寫數字
- tensorflow2.0實現復雜神經網絡(多輸入多輸出nn,Resnet)