1. 程式人生 > >Keras學習基礎(2)

Keras學習基礎(2)

目錄:

  1. Keras的模組結構
    • 資料預處理
    • 模型
    • 網路層
    • 網路配置
  2. Keras中的資料處理
    • 文字預處理
    • 序列預處理
    • 影象預處理
  3. Keras中的模型
    • Sequential順序模型
    • 函式式模型
  4. Keras中的Layers網路層
    • 核心層
    • 卷積層
    • 池化層
    • 迴圈層
    • 嵌入層
    • 合併層
  5. Keras中的網路配置
    • 啟用函式
    • 初始化
    • 正則化

 

 

一、Keras的模組結構

採用keras搭建一個神經網路:

 

 

三、keras的模型:

Keras中包含了兩種定義模型的方法:Sequential模型和Functional模型。

Sequential模型是多個網路層的線性堆疊,而Functional模型則使得使用者可以定義多輸出模型、非迴圈有向模型或具有共享層的模型等複雜模型。 Functional模型具有很高的靈活性,而Sequential模型可以看做其一個特例。

Sequential模型:

這種模型各層之間是依次順序的線性關係,在第k層和第k+1層之間可以加上各種元素來構造神經網路。這些元素可以通過一個列表

來指定,然後作為引數傳遞給序列模型來生成相應的模型。如以下程式碼:

from Keras.models import Sequential
from Keras.layers import Dense,Activation
layers = [ Dense ( 32 , input_shape = (784,)) , 
               Activation('relu'),
               Dense(10),
               Activation('softmax') ]

model = Sequential(layers)

除了一開始直接在一個列表中指定所有元素外,也可以像下面這個例子一樣逐層新增:

from Keras.models import Sequential
from Keras.layers import Dense , Activation

model = Sequential()

model.add(Dense(32,input_shape = (784,)))

model.add(Activation('relu')

model.add(Dense(10))

model.add(Activation('softmax')

 

Functional模型

Functional模型可以用來設計非常複雜、任意拓撲結構的神經網路,例如有向無環網路、共享層網路等。類似於序列模型,Function模型通過函式化的應用介面來定義模型。使用函式化的應用介面有多個好處,比如:決定函式執行結果的唯一要素是其返回值,而決定返回值的唯一要素則是其引數,減輕了程式碼測試的工作量。

案例1----全連線神經網路擬合MNIST的分類模型,輸入資料是28*28的影象、

from keras.layers import Input, Dense
from keras.models import Model

# 定義輸入層input,每一個影象拉成784個畫素點的向量
inputs = Input(shape=(784,))

#定義各個連線層,包括啟用函式,假設從輸入層開始,定義兩個隱含層,都有64個神經元
x = Dense(64, activation='relu')(inputs)
x = Dense(64, activation='relu')(x)

#定義輸出層
y = Dense(10, activation='softmax')(x)

#定義模型物件
model = Model(input=inputs, output=y)

#編譯,對資料進行擬合
model.compile(optimizer='rmsprop',
              loss='categorical_crossentropy',
              metrics=['accuracy'])
model.fit(data, labels)  # starts 

 案例2----雙輸入、雙輸出:LSTM時序預測

輸入: 
新聞語料;新聞語料對應的時間 
輸出: 
新聞語料的預測模型;新聞語料+對應時間的預測模型 

程式碼:

from keras.layers import Input, Embedding, LSTM, Dense
from keras.models import Model

# 標題輸入:接收一個含有 100 個整數的序列,每個整數在 1 到 10000 之間。
# 注意我們可以通過傳遞一個 `name` 引數來命名任何層。
main_input = Input(shape=(100,), dtype='int32', name='main_input')

# Embedding 層將輸入序列編碼為一個稠密向量的序列,每個向量維度為 512。
x = Embedding(output_dim=512, input_dim=10000, input_length=100)(main_input)

# LSTM 層把向量序列轉換成單個向量,它包含整個序列的上下文資訊
lstm_out = LSTM(32)(x)

auxiliary_output = Dense(1, activation='sigmoid', name='aux_output')(lstm_out)

auxiliary_input = Input(shape=(5,), name='aux_input')
x = keras.layers.concatenate([lstm_out, auxiliary_input])

# 堆疊多個全連線網路層
x = Dense(64, activation='relu')(x)
x = Dense(64, activation='relu')(x)
x = Dense(64, activation='relu')(x)

# 最後新增主要的邏輯迴歸層
main_output = Dense(1, activation='sigmoid', name='main_output')(x)

#定義一個具有雙輸入和雙輸出的模型
model = Model(inputs=[main_input, auxiliary_input], outputs=[main_output, auxiliary_output])

#編譯模型,給輔助損失分配一個 0.2 的權重
model.compile(optimizer='rmsprop', loss='binary_crossentropy',
              loss_weights=[1., 0.2])

model.fit([headline_data, additional_data], [labels, labels],
          epochs=50, batch_size=32

函式式模型 的另一個用途是使用共享網路層的模型。

案例3-----共享層

 

 Sequential模型和Functional模型主要差異在於如何定義從輸入層到輸出層的各層結構。

  •  Sequential模型是先定義序列模型物件,而Functional模型先定義輸入層到輸出層各層要素的,包括尺寸結構。
  • Sequential模型可通過add對模型物件依次新增各層資訊,Functional模型通過不停地封裝含有各層網路結構的函式作為引數來定義網路結構的。
  • Sequential模型各層只能依次線性新增,而Functional模型可在原有的網路結構上應用新的結構來快速生成新的模型

 兩個模型有很多共同的方法和屬性:

https://keras.io/zh/models/about-keras-models/