對于高維圖像數(shù)據(jù),卷積神經(jīng)網(wǎng)絡(luò)利用了卷積和池化層,能夠高效提取圖像的重要“特征”,再通過后面的全連接層處理“壓縮的圖像信息”及輸出結(jié)果。對比標準的全連接網(wǎng)絡(luò),卷積神經(jīng)網(wǎng)絡(luò)的模型參數(shù)大大減少了。

二、卷積神經(jīng)網(wǎng)絡(luò)的“卷積”

2.1 卷積運算的原理

在信號處理、圖像處理和其它工程/科學(xué)領(lǐng)域,卷積都是一種使用廣泛的技術(shù),卷積神經(jīng)網(wǎng)絡(luò)(CNN)這種模型架構(gòu)就得名于卷積計算。但是,深度學(xué)習(xí)領(lǐng)域的“卷積”本質(zhì)上是信號/圖像處理領(lǐng)域內(nèi)的互相關(guān)(cross-correlation),互相關(guān)與卷積實際上還是有些差異的。卷積是分析數(shù)學(xué)中一種重要的運算。簡單定義f , g 是可積分的函數(shù),兩者的卷積運算如下:

其定義是兩個函數(shù)中一個函數(shù)(g)經(jīng)過反轉(zhuǎn)和位移后再相乘得到的積的積分。如下圖,函數(shù) g 是過濾器。它被反轉(zhuǎn)后再沿水平軸滑動。在每一個位置,我們都計算 f 和反轉(zhuǎn)后的 g 之間相交區(qū)域的面積。這個相交區(qū)域的面積就是特定位置出的卷積值。

互相關(guān)是兩個函數(shù)之間的滑動點積或滑動內(nèi)積?;ハ嚓P(guān)中的過濾器不經(jīng)過反轉(zhuǎn),而是直接滑過函數(shù) f,f 與 g 之間的交叉區(qū)域即是互相關(guān)。

下圖展示了卷積與互相關(guān)運算過程,相交區(qū)域的面積變化的差異:

在卷積神經(jīng)網(wǎng)絡(luò)中,卷積中的過濾器不經(jīng)過反轉(zhuǎn)。嚴格來說,這是離散形式的互相關(guān)運算,本質(zhì)上是執(zhí)行逐元素乘法和求和。但兩者的效果是一致,因為過濾器的權(quán)重參數(shù)是在訓(xùn)練階段學(xué)習(xí)到的,經(jīng)過訓(xùn)練后,學(xué)習(xí)得到的過濾器看起來就會像是反轉(zhuǎn)后的函數(shù)。

2.2 卷積運算的作用

CNN通過設(shè)計的卷積核(convolution filter,也稱為kernel)與圖片做卷積運算(平移卷積核去逐步做乘積并求和)。

如下示例設(shè)計一個(特定參數(shù))的3×3的卷積核:

讓它去跟圖片做卷積,卷積的具體過程是:

  1. 覆蓋一塊跟卷積核一樣大的區(qū)域之后,對應(yīng)元素相乘,然后求和;
  2. 計算一個區(qū)域之后,就向其他區(qū)域挪動(假設(shè)步長是1),繼續(xù)計算;
  3. 直到把原圖片的每一個角落都覆蓋到為止;

可以發(fā)現(xiàn),通過特定的filter,讓它去跟圖片做卷積,就可以提取出圖片中的某些特征,比如邊界特征。

進一步的,我們可以借助龐大的數(shù)據(jù),足夠深的神經(jīng)網(wǎng)絡(luò),使用反向傳播算法讓機器去自動學(xué)習(xí)這些卷積核參數(shù),不同參數(shù)卷積核提取特征也是不一樣的,就能夠提取出局部的、更深層次和更全局的特征以應(yīng)用于決策。

卷積運算的本質(zhì)性總結(jié):過濾器(g)對圖片(f)執(zhí)行逐步的乘法并求和,以提取特征的過程。卷積過程可視化可訪問:https://poloclub.github.io/cnn-explainer/ 或https://github.com/vdumoulin/conv_arithmetic

三、卷積神經(jīng)網(wǎng)絡(luò)

卷積神經(jīng)網(wǎng)絡(luò)通常由3個部分構(gòu)成:卷積層,池化層,全連接層。簡單來說,卷積層負責提取圖像中的局部及全局特征;池化層用來大幅降低參數(shù)量級(降維);全連接層用于處理“壓縮的圖像信息”并輸出結(jié)果。

3.1 卷積層(CONV)

3.1.1 卷積層基本屬性

卷積層主要功能是動態(tài)地提取圖像特征,由濾波器filters和激活函數(shù)構(gòu)成。一般要設(shè)置的超參數(shù)包括filters的數(shù)量、大小、步長,激活函數(shù)類型,以及padding是“valid”還是“same”。

另外的,卷積的類型除了標準卷積,還演變出了反卷積、可分離卷積、分組卷積等各種類型,可以自行驗證。

3.1.2 卷積層的特點

通過卷積運算的介紹,可以發(fā)現(xiàn)卷積層有兩個主要特點:局部連接(稀疏連接)和權(quán)值共享。

由于局部連接(稀疏連接)和權(quán)值共享的特點,使得CNN具有仿射的不變性(平移、縮放等線性變換)

3.2 池化層(Pooling)

池化層可對提取到的特征信息進行降維,一方面使特征圖變小,簡化網(wǎng)絡(luò)計算復(fù)雜度;另一方面進行特征壓縮,提取主要特征,增加平移不變性,減少過擬合風(fēng)險。但其實池化更多程度上是一種計算性能的一個妥協(xié),強硬地壓縮特征的同時也損失了一部分信息,所以現(xiàn)在的網(wǎng)絡(luò)比較少用池化層或者使用優(yōu)化后的如SoftPool。

池化層設(shè)定的超參數(shù),包括池化層的類型是Max還是Average(Average對背景保留更好,Max對紋理提取更好),窗口大小以及步長等。如下的MaxPooling,采用了一個2×2的窗口,并取步長stride=2,提取出各個窗口的max值特征(AveragePooling就是平均值):

3.3 全連接層(FC)

在經(jīng)過數(shù)次卷積和池化之后,我們最后會先將多維的圖像數(shù)據(jù)進行壓縮“扁平化”, 也就是把 (height,width,channel) 的數(shù)據(jù)壓縮成長度為 height × width × channel 的一維數(shù)組,然后再與全連接層連接(這也就是傳統(tǒng)全連接網(wǎng)絡(luò)層,每一個單元都和前一層的每一個單元相連接,需要設(shè)定的超參數(shù)主要是神經(jīng)元的數(shù)量,以及激活函數(shù)類型),通過全連接層處理“壓縮的圖像信息”并輸出結(jié)果。

3.4 示例:經(jīng)典CNN的構(gòu)建(Lenet-5)

LeNet-5由Yann LeCun設(shè)計于 1998年,是最早的卷積神經(jīng)網(wǎng)絡(luò)之一。它是針對灰度圖進行訓(xùn)練的,輸入圖像大小為32321,不包含輸入層的情況下共有7層。下面逐層介紹LeNet-5的結(jié)構(gòu):

第一層是卷積層,用于過濾噪音,提取關(guān)鍵特征。使用5 * 5大小的過濾器6個,步長s = 1,padding = 0。

第二層是平均池化層,利用了圖像局部相關(guān)性的原理,對圖像進行子抽樣,可以減少數(shù)據(jù)處理量同時保留有用信息,降低網(wǎng)絡(luò)訓(xùn)練參數(shù)及模型的過擬合程度。使用2 * 2大小的過濾器,步長s = 2,padding = 0。池化層只有一組超參數(shù)pool_size 和 步長strides,沒有需要學(xué)習(xí)的模型參數(shù)。

第三層使用5 * 5大小的過濾器16個,步長s = 1,padding = 0。

第四層使用2 * 2大小的過濾器,步長s = 2,padding = 0。沒有需要學(xué)習(xí)的參數(shù)。

第五層是卷積層,有120個5 * 5 的單元,步長s = 1,padding = 0。

有84個單元。每個單元與F5層的全部120個單元之間進行全連接。

Output層也是全連接層,采用RBF網(wǎng)絡(luò)的連接方式(現(xiàn)在主要由Softmax取代,如下示例代碼),共有10個節(jié)點,分別代表數(shù)字0到9(因為Lenet用于輸出識別數(shù)字的),如果節(jié)點i的輸出值為0,則網(wǎng)絡(luò)識別的結(jié)果是數(shù)字i。

如下Keras復(fù)現(xiàn)Lenet-5:

from keras.models import Sequential
from keras import layers

le_model = keras.Sequential()
le_model.add(layers.Conv2D(6, kernel_size=(5, 5), strides=(1, 1), activation='tanh', input_shape=(32,32,1), padding="valid"))
le_model.add(layers.AveragePooling2D(pool_size=(2, 2), strides=(2, 2), padding='valid'))
le_model.add(layers.Conv2D(16, kernel_size=(5, 5), strides=(1, 1), activation='tanh', padding='valid'))
le_model.add(layers.AveragePooling2D(pool_size=(2, 2), strides=(2, 2), padding='valid'))
le_model.add(layers.Conv2D(120, kernel_size=(5, 5), strides=(1, 1), activation='tanh', padding='valid'))
le_model.add(layers.Flatten())
le_model.add(layers.Dense(84, activation='tanh'))
le_model.add(layers.Dense(10, activation='softmax'))

四、CNN圖像分類-keras

keras實現(xiàn)經(jīng)典的CIFAR10圖像數(shù)據(jù)集的分類為例,代碼:https://github.com/aialgorithm/Blog

from keras.datasets import cifar10
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten
from keras.layers import Conv2D, MaxPooling2D
import keras
import os

# 數(shù)據(jù),切分為訓(xùn)練和測試集
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
print('x_train shape:', x_train.shape)
print(x_train.shape[0], 'train samples')
print(x_test.shape[0], 'test samples')
# 展示數(shù)據(jù)集
import matplotlib.pyplot as plt
class_names = ['airplane', 'automobile', 'bird', 'cat', 'deer',
'dog', 'frog', 'horse', 'ship', 'truck']

plt.figure(figsize=(10,10))
for i in range(25):
plt.subplot(5,5,i+1)
plt.xticks([])
plt.yticks([])
plt.grid(False)
plt.imshow(x_train[i])
# The CIFAR labels happen to be arrays,
# which is why you need the extra index
plt.xlabel(class_names[y_train[i][0]])
plt.show()
# 將標簽向量轉(zhuǎn)換為二值矩陣。
num_classes = 10 #圖像數(shù)據(jù)有10個實際標簽類別
y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)

print(y_train.shape, 'ytrain')

# 圖像數(shù)據(jù)歸一化
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255
# 構(gòu)造卷積神經(jīng)網(wǎng)絡(luò)
model = Sequential()

# 圖像輸入形狀(32, 32, 3) 對應(yīng)(image_height, image_width, color_channels)
model.add(Conv2D(32, (3, 3), padding='same',
input_shape=(32, 32, 3)))
model.add(Activation('relu'))
model.add(Conv2D(32, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

# 卷積、池化層輸出都是一個三維的(height, width, channels)
# 越深的層中,寬度和高度都會收縮
model.add(Conv2D(64, (3, 3), padding='same'))
model.add(Activation('relu'))
model.add(Conv2D(64, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

# 3 維展平為 1 維 ,輸入全連接層
model.add(Flatten())
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes)) # CIFAR數(shù)據(jù)有 10 個輸出類,以softmax輸出多分類
model.add(Activation('softmax'))
# 初始化 RMSprop 優(yōu)化器
opt = keras.optimizers.rmsprop(lr=0.001, decay=1e-6)

# 模型編譯:設(shè)定RMSprop 優(yōu)化算法;設(shè)定分類損失函數(shù);
model.compile(loss='categorical_crossentropy',
optimizer=opt,
metrics=['accuracy'])
batch_size = 64
epochs = 5

history = model.fit(x_train, y_train,
batch_size=batch_size,
epochs=epochs,
validation_data=(x_test, y_test),
shuffle=True)

卷積神經(jīng)網(wǎng)絡(luò)優(yōu)化方法(tricks):

超參數(shù)優(yōu)化:可以用隨機搜索、貝葉斯優(yōu)化。推薦分布式超參數(shù)調(diào)試框架Keras Tuner包括了常用的優(yōu)化方法。

數(shù)據(jù)層面:數(shù)據(jù)增強廣泛用于圖像任務(wù),效果提升大。常用有圖像樣本變換、mixup等。更多優(yōu)化方法具體可見:https://arxiv.org/abs/1812.01187

# 保存模型和權(quán)重
num_predictions = 20
save_dir = os.path.join(os.getcwd(), 'saved_models')
model_name = 'keras_cifar10_trained_model.h5'

if not os.path.isdir(save_dir):
os.makedirs(save_dir)
model_path = os.path.join(save_dir, model_name)
model.save(model_path)
print('Saved trained model at %s ' % model_path)

# 評估訓(xùn)練模型
scores = model.evaluate(x_test, y_test, verbose=1)
print('Test loss:', scores[0])
print('Test accuracy:', scores[1])

plt.plot(history.history['accuracy'], label='accuracy')
plt.plot(history.history['val_accuracy'], label = 'val_accuracy')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.ylim([0.5, 1])
plt.legend(loc='lower right')
plt.show()

文章轉(zhuǎn)自微信公眾號@算法進階

上一篇:

終于有人總結(jié)了圖神經(jīng)網(wǎng)絡(luò)

下一篇:

一文搞定深度學(xué)習(xí)建模預(yù)測全流程(Python)
#你可能也喜歡這些API文章!

我們有何不同?

API服務(wù)商零注冊

多API并行試用

數(shù)據(jù)驅(qū)動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費