深度学习每层的通道数如何计算_深度学习基础系列(一)| 一文看懂用kersa构建模型的各层含义(掌握输出尺寸和可训练参数数量的计算方法)...
我們?cè)趯W(xué)習(xí)成熟網(wǎng)絡(luò)模型時(shí),如VGG、Inception、Resnet等,往往面臨的第一個(gè)問題便是這些模型的各層參數(shù)是如何設(shè)置的呢?另外,我們?nèi)绻O(shè)計(jì)自己的網(wǎng)路模型時(shí),又該如何設(shè)置各層參數(shù)呢?如果模型參數(shù)設(shè)置出錯(cuò)的話,其實(shí)模型也往往不能運(yùn)行了。
所以,我們需要首先了解模型各層的含義,比如輸出尺寸和可訓(xùn)練參數(shù)數(shù)量。理解后,大家在設(shè)計(jì)自己的網(wǎng)路模型時(shí),就可以先在紙上畫出網(wǎng)絡(luò)流程圖,設(shè)置各參數(shù),計(jì)算輸出尺寸和可訓(xùn)練參數(shù)數(shù)量,最后就可以照此進(jìn)行編碼實(shí)現(xiàn)了。
而在keras中,當(dāng)我們構(gòu)建模型或拿到一個(gè)成熟模型后,往往可以通過model.summary()來觀察模型各層的信息。
本文將通過一個(gè)簡(jiǎn)單的例子來進(jìn)行說明。本例以keras官網(wǎng)的一個(gè)簡(jiǎn)單模型VGG-like模型為基礎(chǔ),稍加改動(dòng)代碼如下:
from tensorflow importkerasfrom tensorflow.keras.models importSequentialfrom tensorflow.keras.layers importDense, Dropout, Flattenfrom tensorflow.keras.layers importConv2D, MaxPool2D
(train_data, train_labels), (test_data, test_labels)=keras.datasets.mnist.load_data()
train_data= train_data.reshape(-1, 28, 28, 1)print("train data type:{}, shape:{}, dim:{}".format(type(train_data), train_data.shape, train_data.ndim))
# 第一組
model=Sequential()
model.add(Conv2D(filters=32, kernel_size=(3, 3), strides=(1, 1), padding='valid', activation='relu', input_shape=(28, 28, 1)))
model.add(Conv2D(filters=32, kernel_size=(3, 3), strides=(1, 1), padding='valid', activation='relu'))
model.add(MaxPool2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
# 第二組
model.add(Conv2D(filters=64, kernel_size=(3, 3), strides=(1, 1), padding='valid', activation='relu'))
model.add(Conv2D(filters=64, kernel_size=(3, 3), strides=(1, 1), padding='valid', activation='relu'))
model.add(MaxPool2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
# 第三組
model.add(Flatten())
model.add(Dense(units=256, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(units=10, activation='softmax'))
model.summary()
本例的數(shù)據(jù)來源于mnist,這是尺寸為28*28,通道數(shù)為1,也即只有黑白兩色的圖片。其中卷積層的參數(shù)含義為:
filters:表示過濾器的數(shù)量,每一個(gè)過濾器都會(huì)與對(duì)應(yīng)的輸入層進(jìn)行卷積操作;
kernel_size:表示過濾器的尺寸,一般為奇數(shù)值,如1,3,5,這里設(shè)置為3*3大小;
strides:表示步長(zhǎng),即每一次過濾器在圖片上移動(dòng)的步數(shù);
padding:表示是否對(duì)圖片邊緣填充像素,一般有兩個(gè)值可選,一是默認(rèn)的valid,表示不填充像素,卷積后圖片尺寸會(huì)變小;另一種是same,填充像素,使得輸出尺寸和輸入尺寸保持一致。
如果選擇valid,假設(shè)輸入尺寸為n * n,過濾器的大小為f * f,步長(zhǎng)為s,則其輸出圖片的尺寸公式為:[(n - f)/s + 1] * [(n -f)/s + 1)],若計(jì)算結(jié)果不為整數(shù),則向下取整;
如果選擇same,假設(shè)輸入尺寸為n * n,過濾器的大小為f * f,要填充的邊緣像素寬度為p,則計(jì)算p的公式為:n + 2p -f? +1 = n, 最后得 p = (f -1) /2。
運(yùn)行上述例子,可以看到如下結(jié)果:
train data type:, shape:(60000, 28, 28, 1), dim:4
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d (Conv2D) (None, 26, 26, 32) 320
_________________________________________________________________
conv2d_1 (Conv2D) (None, 24, 24, 32) 9248
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 12, 12, 32) 0
_________________________________________________________________
dropout (Dropout) (None, 12, 12, 32) 0
_________________________________________________________________
conv2d_2 (Conv2D) (None, 10, 10, 64) 18496
_________________________________________________________________
conv2d_3 (Conv2D) (None, 8, 8, 64) 36928
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 4, 4, 64) 0
_________________________________________________________________
dropout_1 (Dropout) (None, 4, 4, 64) 0
_________________________________________________________________
flatten (Flatten) (None, 1024) 0
_________________________________________________________________
dense (Dense) (None, 256) 262400
_________________________________________________________________
dropout_2 (Dropout) (None, 256) 0
_________________________________________________________________
dense_1 (Dense) (None, 10) 2570
=================================================================
Total params: 329,962
Trainable params: 329,962
Non-trainable params: 0
讓我們解讀下,首先mnist為輸入數(shù)據(jù),尺寸大小為?(60000, 28, 28, 1), 這是典型的NHWC結(jié)構(gòu),即(圖片數(shù)量,寬度,高度,通道數(shù));
其次我們需要關(guān)注表格中的"output shape"輸出尺寸,其遵循mnist一樣的結(jié)構(gòu),只不過第一位往往是None,表示圖片數(shù)待定,后三位則按照上述規(guī)則進(jìn)行計(jì)算;
最后關(guān)注的是"param"可訓(xùn)練參數(shù)數(shù)量,不同的模型層計(jì)算方法不一樣:
對(duì)于卷積層而言,假設(shè)過濾器尺寸為f * f, 過濾器數(shù)量為n, 若開啟了bias,則bias數(shù)固定為1,輸入圖片的通道數(shù)為c,則param計(jì)算公式= (f * f * c + 1) * n;
對(duì)于池化層、flatten、dropout操作而言,是不需要訓(xùn)練參數(shù)的,所以param為0;
對(duì)于全連接層而言,假設(shè)輸入的列向量大小為i,輸出的列向量大小為o,若開啟bias,則param計(jì)算公式為=i * o + o
按照代碼中劃分的三組模型層次,其輸出尺寸和可訓(xùn)練參數(shù)數(shù)量的計(jì)算方法可如下圖所示:
第一組:
第二組:
第三組:
至此,模型各層的含義和相關(guān)計(jì)算方法已介紹完畢,希望此文能幫助大家更好地理解模型的構(gòu)成和相關(guān)計(jì)算。
總結(jié)
以上是生活随笔為你收集整理的深度学习每层的通道数如何计算_深度学习基础系列(一)| 一文看懂用kersa构建模型的各层含义(掌握输出尺寸和可训练参数数量的计算方法)...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: elementui 下拉框回显_elem
- 下一篇: tensorflow环境下的识别食物_研