Keras入門

首先當然是安裝Keras。需要注意的是Keras有三種後端backend。後端是意思是Keras需要依賴他們進行張量的運算。這三種後端是:tensorflow,Theano,CNTK(微軟)。這也是keras的優勢:可以在多種生態中發佈。一般使用Tensorflow作爲後端,所以在安裝Keras之前需要先安裝tensorflow。在安裝好Keras之後,命令行中import keras會提示using tenserflow backend,這就是在提示我們正在使用的是Tensorflow的後端,而不是錯誤信息。

然後介紹模型。Keras的模型有兩種方式構造。

第一種是使用Sequential序貫模型。可以直接在Sequential中定義,

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

model = Sequential([
    Dense(32, input_shape=(784,)),
    Activation('relu'),
    Dense(10),
    Activation('softmax'),
])
model = Sequential()
model.add(Dense(32, input_dim=784))
model.add(Activation('relu'))  #可以通過name設置層名字,加載已有模型可以通過名字判斷是否加載這一層的權重

model.pop() #刪除最後添加的層 

第二種是函數式。

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

a = Input(shape=(32,))
b = Dense(32)(a)
model = Model(inputs=a, outputs=b)

構建好之後使用一行函數就可以打印模型各層的參數。

model.summary()

模型編譯

我理解的編譯是一個靜態的過程。是將模型與loss,優化器optimizer,評估標準metrics聯繫起來。

# 多分類問題
model.compile(optimizer='rmsprop',
              loss='categorical_crossentropy',
              metrics=['accuracy'])

# 二分類問題
model.compile(optimizer='rmsprop',
              loss='binary_crossentropy',
              metrics=['accuracy'])

# 均方誤差迴歸問題
model.compile(optimizer='rmsprop',
              loss='mse')

 

數據

注意這裏的label使用了onehot編碼。onehot編碼就是使用01字符串對類別標籤進行編碼,但不同於通信中力求編碼長度最短,onehot的one指的就是一次編碼中只出現一個1,其餘全爲0,這樣onehot編碼長度應該等於種類數。在這個函數中取的是標籤列表中最大值+1.所以準確來說返回的是一個01構成的矩陣,矩陣行數是種類類別數,列數是種類標籤值的最大值加1.這樣做可能是認爲種類標籤值應該是連續的,爲不存在的類別預留位置,同時也體現了類別之間的距離。

import keras

ohl=keras.utils.to_categorical([1,3])
print(ohl)
<<<
[[0. 1. 0. 0.]
 [0. 0. 0. 1.]]

對圖像數據,一般使用keras提供的函數轉換爲array。

image = cv2.imread(path)
feature = cv2.resize(image,(IMAGE_DIMS[0],IMAGE_DIMS[1]))
feature = img_to_array(feature) #轉換爲類似float型的ndarray
features=feature/255.0  # tensor範圍是0~1

可以使用yield(data,label)定義函數作爲生成器。藉助生成器的Next功能,每次只迭代一個值,減少了對內存的消耗。

模型訓練

這一步是動態的過程,將模型針對數據做適應,所以使用了fit函數。

# 生成虛擬數據
import numpy as np
data = np.random.random((1000, 100))
labels = np.random.randint(10, size=(1000, 1))

# 將標籤轉換爲分類的 one-hot 編碼
one_hot_labels = keras.utils.to_categorical(labels, num_classes=10)

# 訓練模型,以 32 個樣本爲一個 batch 進行迭代
model.fit(data, one_hot_labels, epochs=10, batch_size=32)

但現實中往往沒有這麼簡單。現實中數據量很大,同時我們還需要進行數據增強,所以更多時候使用的是fit_generator方法。這種方法就利用了剛纔提到的yeild構成的生成器,生成器作爲第一個參數。因爲生成器不像return一樣輸出就停止了,生成器會一直在上一步停止的地方開始執行,且是按照單位輸出的(單位一般是batch_size),爲了區別epoch的次數,我們還需要明確參數steps_per_epoch的取值。每次epoch遍歷了完整的數據集,那麼每次epoch就需要(數據長度/生成器每次輸出長度) 次的生成器操作。所以我認爲下面第二種解釋是更合理的。

history = model.fit_generator(generator(),epochs=epochs,steps_per_epoch=len(x_train)//(batch_size*epochs))
history = model.fit_generator(generator(),epochs=epochs,steps_per_epoch=len(x_train)//(batch_size))

此外,還可以使用model.train_on_batch(x,y) 和 model.test_on_batch(x,y) 進行批量訓練與測試。

訓練進行中

fit_generator中還有一個可選參數是callback,雖然翻譯叫做回調函數,但是它其實是一個類。而回調的意思是在訓練的過程中我們可以通過它對模型的參數進行保存和調整。

checkpoint回調函數,可以對模型參數進行保存,這樣即便訓練過程意外中斷,我們可以接着中斷的地方繼續訓練。

LearningStepSchedule回調函數,可以對模型學習率按照策略進行調整。

#keras提供了兩種學習率的更新方式
keras.callbacks.LearningRateScheduler(schedule) #第一種通過定義schedule函數,這個函數一般以epoch爲自變量進行調整
keras.callbacks.ReduceLROnPlateau(monitor='val_loss', factor=0.1, patience=10, verbose=0, mode='auto', epsilon=0.0001, cooldown=0, min_lr=0) #第二種自動根據檢測量的變化情況調整

#定義checkpoint
filepath="weights-improvement-{epoch:02d}-{val_acc:.2f}.hdf5"
checkpoint= ModelCheckpoint(filepath, monitor='val_acc', verbose=1, save_best_only=True, mode='max')

# Earlystop回調函數可以提前終止訓練
early_stopping = EarlyStopping(monitor='val_loss', patience=2)

#定義的lr和checkpoint兩個回調函數可以同時以列表的形式寫在fit參數中
model.fit(train_set_x, train_set_y, validation_split=0.1, nb_epoch=200, batch_size=256, callbacks=[checkpoint,lr]) 

模型評估

score = model.evaluate(data_test, label_test, batch_size=32)

Reference:

https://keras.io/zh/

https://keras-cn.readthedocs.io/en/latest/models/about_model/

發佈了62 篇原創文章 · 獲贊 37 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章