iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 15
0
AI & Data

AI+Line系列 第 15

Day15 CNN卷積神經網路程式(3):建構模型

  • 分享至 

  • xImage
  •  

使用Keras建立簡單的CNN模型
Keras建立模型有三種方法:1.Sequential 2.Funciton API 3.自定義

我們用第一種Sequential,然後對model.add一層一層的增加Layer
CNN會有卷積層、池化層、全連接層
這些名詞第一次聽到會很陌生,要全部搞懂需要把論文、微積分、線性代數讀通,所以我們以潛白的話語來形容

建立模型
model = Sequential()

卷積層:
Convolution2D:Convolution是卷積,因為圖片是二維,所以叫2D
batch_input_shape:輸入的向量格式,None就是之前-1的意思,1代表channel(灰階為1,RGB為3),28,28是長寬
filters過濾器ㄤ像是機器的圖形識別器,一開始隨機產生,有的是識別直線、橫線、斜線等等,經過訓練後,去偵測圖的紋理特徵
kernel_size:每個filter的大小,通常會用5x5或3x3,設定5或3,經驗上效果最好
strides:filter去掃這張圖時,每次跨一步,橫向每次跨一步,橫向掃完後依序往直向跨一步,直到整張圖掃完
padding:'same'會在這張圖周圍補白邊,這樣用5x5或3x3掃圖完後,掃出來的圖的大小才會與原圖一樣大
data_format:channels_first就會是(None, 1, 28, 28),如果channels_last就會是(None, 28, 28, 1),這在GPU運算上速度會有差別

model.add(Convolution2D(
    batch_input_shape=(None, 1, 28, 28),
    filters=32,
    kernel_size=5,
    strides=1,
    padding='same',     # Padding method
    data_format='channels_first',
))

卷積完,通常會做激勵函數relu,正數保持原數、負數會變成0,圖片的神經網路通常正數才是我們要的參數,幫助神經網路提高效率、減少不必要的計算
model.add(Activation('relu'))

然後做一個池化層
MaxPooling2D:最大池化層
pool_size=2:想像每2x2的像素,四個像素中哪個數字最大,就保留這格的值
strides=2:每次跨兩步,輸入張量會變成原來的一半。想像整張照片會縮小成原來寬的1/2、長的1/2

model.add(MaxPooling2D(
    pool_size=2,
    strides=2,
    padding='same',
    data_format='channels_first',
))

以上「卷積層、激勵函數、池化層」可以重複好幾次,不斷去抽取特徵,從最小的紋理、到逐漸變大的局部特徵(例如一開始的線條紋理,後面則是眼睛、鼻子、車燈、杯子等大特徵)

全連接層
我們會把向量先壓扁,從2D變成1D一長串的向量

model.add(Flatten())
model.add(Dense(1024))
model.add(Activation('relu'))

然後我們最後會預測問題是分類的問題,例如數字是0~9共十個分類,因此接一個Dense10,並且用softmax作為multi-class的分類問題(這些名詞未來會說明)

model.add(Dense(10))
model.add(Activation('softmax'))

上一篇
Day14 CNN卷積神經網路程式(2):觀察樣本
下一篇
Day16 CNN卷積神經網路程式(4):訓練模型
系列文
AI+Line30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言