目錄:
- Keras的模塊結構
- 數據預處理
- 模型
- 網絡層
- 網絡配置
- Keras中的數據處理
- 文本預處理
- 序列預處理
- 圖像預處理
- Keras中的模型
- Sequential順序模型
- Model模型【通用模型】
- Keras中的Layers網絡層
- 核心層
- 卷積層
- 池化層
- 循環層
- 嵌入層
- 合並層
- Keras中的網絡配置
- 激活函數
- 初始化
- 正則化
- Keras模型保存和讀取
- 保存
- 讀取
一、Keras的模塊結構
采用keras搭建一個神經網絡:
二、Keras的數據處理:
Keras提供的處理數據工具所有函數都在keras.preprocessing這個庫中,分布有text、sequence和image三個子庫。
1、文本預處理:keras.preprocessing.text【針對英文】
標注(Tokenize):在文本處理中,一般先將原始文本拆解成單字符、單詞或者詞組,然后將這些拆分后的要素進行索引、標記化供機器學習算法使用。幾個步驟如下:
-
- 文字拆分(text_to_word_sequence)
- 建立索引(one_hot)
- 序列補齊(Padding)
- 轉換成矩陣
- 使用標注類批量處理文本文件(Tokenizer)
(1)文字拆分:text_to_word_sequence函數
將一段文字根據預定義的分隔符(不能為空值)切分成字符串或單詞(英文)。這個函數返回一個單詞列表,但是會先處理一下,如去掉停止詞或全轉成小寫字母等。如以下例子:
默認情況下,text_to_word_sequence函數使用引號作為分隔符,若在中文分詞中,見到引號才分割,若filters = ‘。:’,這時分隔符發生了變化,這個函數使用過濾符號作為分隔符。故中文分詞應該使用結巴分詞。
(2)建立索引:sort + dict / one-hot編碼
完成分詞以后,得到的單詞或字符不能直接用於建模,還需要將它們轉換成數字序號,才能進行后續處理-----建立索引。
- 建立索引的方法1:對於拆分出來的每一個字符或單詞,排序之后編號即可。
第一句sort將原字符串反向排序,第二句先通過zip命令將每個單詞依次與序號配對,然后通過list將配對的數據轉為列表,每個元素如('with',0)這樣的一對,最后應用字典將列表轉成字典完成索引。
- 建立索引方法2:(one-hot編碼)對於K個不同的字符或單詞,依次設定一個1到K之間的數值來索引這K個字符或單詞構成的詞匯表。可采用one-hot函數來實現。
one-hot函數有兩個參數:一個是待索引的字符串列表,一個是最大索引值n。這個函數將輸入的字符串列表按照規則【hash函數】將其分配給0,……,n-1共n個索引值其中之一。
采用one-hot存在兩種情況,如果 n< 不同字符的個數,則產生hash碰撞【即不同的字符串產生相同的hash值,one-hot編碼相等】;如果n >= 不同字符的個數,可能產生稀疏。故采用one-hot建立索引都不理想。
one-hot源碼解釋如下:
(3)序列補齊:補充回上下文信息。pad_sequences函數
最終索引之后的文字信息會被按照索引編號放入多維矩陣中用來建模。這個多維矩陣的行寬對應於所有拆分后的字符或者單詞,但是在將索引放入矩陣中之前,需要先進行序列補齊的工作。因為拆分之后,單詞之間缺失了上下文信息。
序列補齊分兩種情況:
第一種:將不同的長度的文本補齊成統一長度。
自然的文本序列,比如微博或者推特上的一段話,都是一個自然的字符或單詞序列,而待建模的數據是由很多微博或者推特組成的,或者對一組文章進行建模,每篇文章的每一句話構成一個文本序列。此時每句話長度不一,需要進行補齊為統一長度。
第二種:將一段話移動固定窗口,即拆分為多個固定窗口的子串。
將一個由K個(K較大)具備一定順序的單詞串拆分成小塊的連續子串,每個子串只有M個(M<K)單詞。這種情況一般是一大段文字按照固定長度移動一個窗口,將窗口內的單詞索引載入多維矩陣的每一行,因此一句話可能會對應於矩陣的多行數據,形成時間步(timestep)。
序列補齊可以使用pad_sequences函數,其輸入要素是列表串(list of list)。假設有一個列表串,包含了單詞的索引號,下面代碼展示了在不同設置選項下使用這個函數如何補齊序列。
padding選項指定是從后面補齊還是前面補齊,
補齊的索引數字默認為0,不過可以通過value選項修改。
如果不用maxlen選項設定補齊序列的長度,則按照最長列表元素的長度來設定。如果設定的補齊序列的長度小於一些列表元素的長度,那么會產生截斷。截斷的標准是假如補齊序列的長度為k,則保留最后k個索引值。
(4)轉換為矩陣
所有的建模都只能使用多維矩陣,因此最后必須將索引過的文字元素轉換成可以用於建模的矩陣。keras提供了兩種方法。
第一種:使用pad_sequences函數。該函數可建立相應的矩陣。
第二種:使用下面要介紹的標注類來進行。因為一般要將文字轉換為矩陣的情況多對應多個不同的文本(比如不同的小說),或者同一個文本的不同段落(比如同一個小說的不同章節等)。因此對應大量元素的列表串。
(5)使用標注類批量處理文本文件:Tokenizer class
當批量處理文本文件時,需要一種更高效的方法。keras提供了一個標注類(Tokenizer class)來進行文本處理。當批量處理文本文件時,一般所有文本會被讀入一個大的列表中,每一個元素是單個文件的文本或者一大段文本。
上面的方法針對單一字符串設計的,標注類的方法是針對一個文本列表設計的。
Tokenizer class對應的操作數據有兩種類型,分別是文本列表和單詞串列表,對應的方法包含“text"或者”sequences"字樣,對應於文本列表的方法都是將文本拆分成單詞串以后執行相應的操作。
假設已經通過open(file).read()函數將一系列文本文件讀入alltext這個列表變量中,每一個元素是一個文本文件中的文本。在進行所有預處理之前,先初始化標注對象:
from keras.preprocessing.text import Tokenizer tokenizer = Tokenizer(nb_words = 1000) tokenizer.fit_on_texts(alltext)
fit_on_texts()函數的作用是對於輸入的文本計算一些關鍵統計量,並對里面的元素進行索引。
- 首先,依次遍歷文本列表變量元素,對於每 一個字符串元素,使用上面提到的 text_to_word_sequence函數進行拆分,並統一 為小寫字符。
- 其次,計算單詞出現的總頻率和在不同文件 中分別出現的頻率,並對單詞表排序。
- 最后,計算總的單詞量,並對每一個單詞建 立一個總的索引和一個在不同文件中的索引。
完成上述准備工作之后,就可以對整個列表 中的元素進行拆分了。
word_sequences = tokenizer.texts_to_sequences(alltext)
將每一個文本字符串拆分成單詞以后,還需要對每個字符串做序列補齊的工作,才能將其最 終轉換為可用於建模的矩陣。這時就要用到上面 提到的pad_sequences函數,其用法一樣:
padded_word_sequences = pad_sequences(word_sequences,maxlen = MAX_sequence_length)
在標注類中有兩個方法是用來將文本序列列 表轉換為待建模矩陣的,即text_to_matrix和 sequence_to_matrix。其中text_to_matrix基於后 者,對從文本序列列表中抽取的每一個序列元素 應用sequence_to_matrix轉換為矩陣。
2、序列數據預處理:TimeseriesGenerator
keras.preprocessing.sequence.TimeseriesGenerator(data, targets, length, sampling_rate=1, stride=1, start_index=0, end_index=None, shuffle=False, reverse=False, batch_size=128)
- TimeseriesGenerator用來生成批量時序數據,這個類以一系列相等間隔以及一些時間序列參數(如步長、歷史長度等)匯集的數據點作為輸入,以生成用於訓練/驗證的批次數據。
- pad_sequences:將多個序列截斷或補齊為相同長度。
- skipgrams:生成skipgram詞對。
- make_sampling_table:生成一個基於單詞的概率采樣表。
TimeseriesGenerator例子:
from keras.preprocessing.sequence import TimeseriesGenerator import numpy as np data = np.array([[i] for i in range(50)]) targets = np.array([[i] for i in range(50)]) data_gen = TimeseriesGenerator(data, targets, length=10, sampling_rate=2, batch_size=2) assert len(data_gen) == 20 batch_0 = data_gen[0] x, y = batch_0 assert np.array_equal(x, np.array([[[0], [2], [4], [6], [8]], [[1], [3], [5], [7], [9]]])) assert np.array_equal(y, np.array([[10], [11]]))
skipgrams例子:skipgrams函數將一個詞向量索引標號按照 兩種可選方式轉化為一系列兩兩元素的組合 (w1,w2)和標注z。如果w2跟w1是緊挨着 的,則標注z為1,為正樣本;如果w2是從不相鄰 的其他元素中隨機抽取的,則標注z為負樣本。
3、圖片數據處理:
Keras為圖片數據的輸入提供了一個很好的接 口,即 Keras.preprocessing.image.ImageDataGenerator類。 這個類生成一個數據生成器(Generator)對象, 依照循環批量產生對應於圖像信息的多維矩陣。 根據后台運行環境的不同,比如是TensorFlow還 是Theano,多維矩陣的不同維度對應的信息分別 是圖像二維的像素點,第三維對應於色彩通道, 因此如果是灰度圖像,那么色彩通道只有一個維度;如果是RGB色彩,那么色彩通道有三個維 度。
三、keras的模型:
Keras中包含了兩種定義模型的方法:Sequential模型和Model模型。
1、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')
2、Model模型
Model模型可以用來設計非常復雜、任意拓撲結構的神經網絡,例如有向無環網絡、共享層網絡等。類似於序列模型,Model模型通過函數化的應用接口來定義模型。使用函數化的應用接口有多個好處,比如:決定函數執行結果的唯一要素是其返回值,而決定返回值的唯一要素則是其參數,減輕了代碼測試的工作量。
案例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模型和Model模型主要差異在於如何定義從輸入層到輸出層的各層結構。
- Sequential模型是先定義序列模型對象,而Model模型先定義輸入層到輸出層各層要素的,包括尺寸結構。
- Sequential模型可通過add對模型對象依次添加各層信息,Model模型通過不停地封裝含有各層網絡結構的函數作為參數來定義網絡結構的。
- Sequential模型各層只能依次線性添加,而model模型可在原有的網絡結構上應用新的結構來快速生成新的模型
兩個模型有很多共同的方法和屬性:
https://keras.io/zh/models/about-keras-models/
四、Keras中的Layers網絡層
在Keras中,定義神經網絡的具體結構是通過組織不同的網絡層(Layer) 來實現的。
1、核心層
核心層(Core Layer)是構成神經網絡最常 用的網絡層的集合,包括:全連接層、激活層、
放棄層、扁平化層、重構層、排列層、向量反復 層、Lambda層、激活值正則化層、掩蓋層。所有 的層都包含一個輸入端和一個輸出端,中間包含 激活函數以及其他相關參數等。
(1)全連接層。【Dense】在神經網絡中最常見的網 絡層就是全連接層,在這個層中實現對神經網絡
里面的神經元的激活。比如:y=g(x′w+b),其 中w是該層的權重向量,b是偏置項,g()是激 活函數。如果use_bias選項設置為False,那么偏
置項為0。常見的引用全連接層的語句如下:
model.add(Dense(32,activation = 'relu', use_bias=True, kernel_initializer='glorot_uniform', bias_initializer='zeros', activity_regularizer=regularizers.l1_l2(0.2,0.5)))
- 32,表示向下一層輸出向量的維度
- activation='relu',表示使用relu函數作為對應 神經元的激活函數
- kernel_initializer='uniform',表示使用均勻分 布來初始化權重向量,類似的選項也可以用 在偏置項上。讀者可以參考前面的“初始化 對象”部分的介紹。
- activity_regularizer=regularizers.l1_l2(0.2, 0.5),表示使用彈性網作為正則項,其中一 階的正則化參數為0.2,二階的正則化參數為 0.5。
(2)激活層。【activation】激活層是對上一層的輸出應 用激活函數的網絡層,這是除應用activation選項之外,另一種指定激活函數的方式。其用法很簡單,只要在參數中指明所需的激活函數即可,預 先定義好的函數直接引用其名字的字符串,或者 使用TensorFlow和Theano自帶的激活函數。如果這是整個網絡的第一層,則需要用input_shape指定輸入向量的維度。
(3)放棄層。【Dropout】放棄層(Dropout)是對該層 的輸入向量應用放棄策略。在模型訓練更新參數的步驟中,網絡的某些隱含層節點按照一定比例 隨機設置為不更新狀態,但是權重仍然保留,從 而防止過度擬合。這個比例通過參數rate設定為0 到1之間的實數。在模型訓練時不更新這些節點的參數,因此這些節點並不屬於當時的網絡;但是保留其權重,因此在以后的迭代次序中可能會 影響網絡,在打分的過程中也會產生影響,所以 這個放棄策略通過不同的參數估計值已經相對固 化在模型中了。
(4)扁平化層。【Flatten】扁化層(Flatten)是將一個 維度大於或等於3的高維矩陣按照設定“壓扁”為 一個二維的低維矩陣。其壓縮方法是保留第一個 維度的大小,然后將所有剩下的數據壓縮到第二 個維度中,因此第二個維度的大小是原矩陣第二 個維度之后所有維度大小的乘積。這里第一個維 度通常是每次迭代所需的小批量樣本數量,而壓 縮后的第二個維度就是表達原圖像所需的向量長 度。
比如輸入矩陣的維度為(1000,64,32, 32),扁平化之后的維度為(1000,65536),
其中65536=64×32×32。如果輸入矩陣的維度為 (None,64,32,32),則扁平化之后的維度為(None,65536)。
(5)重構層。【Reshape】重構層(Reshape)的功能和Numpy的Reshape方法一樣,將一定維度的多維矩 陣重新排列構造為一個新的保持同樣元素數量但 是不同維度尺寸的矩陣。其參數為一個元組(tuple),指定輸出向量的維度尺寸,最終的向 量輸出維度的第一個維度的尺寸是數據批量的大 小,從第二個維度開始指定輸出向量的維度大小。
比如可以把一個有16個元素的輸入向量重構 為一個(None,4,4)的新二維矩陣:最后的輸出向量不是(4,4),而是 (None,4,4)。
from keras.layers import Reshape model = Sequential() model.add(Reshape((4,4),input_shape = (16,)))
(6)排列層。排列層(Permute)按照給定 的模式來排列輸入向量的維度。這個方法在連接
卷積網絡和時間遞歸網絡的時候非常有用。其參 數是輸入矩陣的維度編號在輸出矩陣中的位置。 比如:
from keras.layers import Permute model = Sequential() model.add(Permute((2, 1), input_shape=(10, 64))) # 現在: model.output_shape == (None, 64, 10) # 注意: `None` 是批表示的維度
將輸入向量的第一維和第二維的數據進行交換后輸出, 這個例子使用了input_shape參數,它一般在第一 層網絡中使用,在接下來的網絡層中,Keras能自己分辨輸入矩陣的維度大小。
(7)向量反復層。【RepeatVector】向量反復層 就是將輸入矩陣重復多次。比如下面這個例子:
輸入尺寸:2D 張量,尺寸為 (num_samples, features)
。
輸出尺寸:3D 張量,尺寸為 (num_samples, n, features)
。
from keras.layers import RepeatVector model = Sequential() model.add(Dense(32, input_dim=32)) # 現在: model.output_shape == (None, 32) # 注意: `None` 是批表示的維度 model.add(RepeatVector(3)) # 現在: model.output_shape == (None, 3, 32)
(8)Lambda層。Lambda層可以將任意表達 式包裝成一個網絡層對象。參數就是表達式,一 般是一個函數,可以是一個自定義函數,也可以 是任意已有的函數。如果使用Theano和自定義函 數,可能還需要定義輸出矩陣的維度。如果后台 使用CNTK或TensorFlow,可以自動探測輸出矩陣的維度。比如:
from keras.layers import Lambda model.add(Lambda(lambda x:x**2))
(9)激活值正則化層。ActivityRegularization,這個網絡層的作用 是對輸入的損失函數更新正則化
(10)掩蓋層。Masking,該網絡層主要使用在跟時間 有關的模型中,比如LSTM。其作用是輸入張量 的時間步,在給定位置使用指定的數值進行“屏蔽”,用以定位需要跳過的時間步。輸入張量的時間步一般是輸入張量的第1維度(維度從0開始算,見例子),如果輸入張量 在該時間步上等於指定數值,則該時間步對應的 數據將在模型接下來的所有支持屏蔽的網絡層被 跳過,即被屏蔽。如果模型接下來的一些層不支 持屏蔽,卻接收到屏蔽過的數據,則拋出異常。
model = Sequential() model.add(Masking(mask_value=0., input_shape=(timesteps, features))) model.add(LSTM(32))
如果輸入張量X[batch,timestep,data]對應 於timestep=5,7的數值是0,即X[:,[5,7],:]=0,那么上面的代碼指定需要屏蔽的對象 是所有數據為0的時間步,然后接下來的長短記 憶網絡在遇到時間步為5和7的0值數據時都會將 其忽略掉。
2、卷積層:
Conv1D、Conv2D和Conv3D的選項幾乎相同。
3、池化層:
(1)最大統計量池化方法:MaxPooling1D、MaxPooling2D、MaxPooling3D
(2)平均統計量池化方法:AveragePooling1D、AveragePooling2D和 AveragePooling3D。
(3)全局池化方法:一維池化:GlobalMaxPooling1D和 GlobalAveragePooling1D。二維池化:GlobalMaxPooling2D和 GlobalAveragePooling2D。
4、循環層:
(1)簡單循環層:recurrent.SimipleRNN
(2)長短記憶層:LSTM
(3)帶記憶門的循環層(GRU)。
5、嵌入層:
嵌入層(Embedding Layer)是使用在模型第 一層的一個網絡層,其目的是將所有索引標號映 射到致密的低維向量中,比如[[4],[32],[67]]→[[0.3,0.9,0.2],[-0.2,0.1,0.8],[0.1, 0.3,0.9]]就是將一組索引標號映射到一個三維的 致密向量中,通常用在對文本數據進行建模的時 候。輸入數據要求是一個二維張量:(批量數, 序列長度),輸出數據為一個三維張量:(批量 數,序列長度,致密向量的維度)。
6、合並層:
合並層是指將多個網絡產生的張量通過一定 方法合並在一起,可以參看下一節中的奇異值分 解的例子。合並層支持不同的合並方法,包括: 元素相加(merge.Add)、元素相乘(merge.Multiply)、元素取平均 (merge.Average)、元素取最大 (merge.Maximum)、疊加(merge.Concatenate)、矩陣相乘 (merge.Dot)。
其中,元素相加、元素相乘、元素取平均、 元素取最大方法要求進行合並的張量的維度大小 完全一致。疊加方法要求指定按照哪個維度(axis)進行疊加,除了疊加的維度,其他維度 的大小必須一致。矩陣相乘方法是對兩個張量采 用矩陣乘法的形式來合並,因為張量是高維矩 陣,因此需要指定沿着哪個維度(axis)進行乘 法操作。同時可以指定是否標准化 (Normalize),如果是的話 (Normalize=True),則先將兩個張量歸一化以 后再相乘,這時得到的是余弦相似度。
來自於MIT Technology Review的圖很好地解釋了合並層:
五、keras的網絡配置
1、激活函數
在Keras中使 用激活對象有兩種方法:一是單獨定義一個激活 層;二是在前置層里面通過激活選項來定義所需 的激活函數。比如,下面兩段代碼是等效的,前 一段是通過激活層來使用激活對象的;后一段是 使用前置層的激活選項來使用激活對象的。
model.add(Dense(64,input_shape(784,))) model.add(Activation('tanh')) model.add(Dense(64,input_shape = (784,),activation = 'tanh'))
- tanh
- softmax
- softsign
- softplus
- elu
- relu
- sigmoid
- hard_sigmoid
- linear
2、初始化:
初始化對象(Initializer)用於隨機設定網絡 層激活函數中的權重值或者偏置項的初始值,包 括kernel_initializer和bias_initializer。好的權重初 始化值能幫助加快模型收斂速度。Keras預先定義
了很多不同的初始化對象,包括:
- Zeros,將所有參數值都初始化為0。
- Ones,將所有參數值都初始化為1。
- Constant(value=1),將所有參數值都初始 化為某一個常量,比如這里設置為1。
- RandomNormal,將所有參數值都按照一個正 態分布所生成的隨機數來初始化。正態分布 的均值默認為0,而標准差默認為0.05。可以 通過mean和stddev選項來修改。
- TruncatedNormal,使用一個截斷正態分布生 成的隨機數來初始化參數向量,默認參數均 值為0,標准差為0.05。對於均值的兩個標准 差之外的隨機數會被遺棄並重新取樣。這種 初始化方法既有一定的多樣性,又不會產生 特別偏的值,因此是比較推薦的方法。針對 不同的常用分布選項,Keras還提供了兩個基於這種方法的特例,即glorot_normal和 he_normal。前者的標准差不再是0.05,而是 輸入向量和輸出向量的維度的函數:stddev = √(2/(n1+n2)),其中n1是輸入向量的維 度,而n2是輸出向量的維度;后者的標准差只是輸入向量的維度的函數:stddev = √(2/n1)
- RandomUniform,按照均勻分布所生成的隨 機數來初始化參數值,默認的分布參數最小 值為-0.05,最大值為0.05,可以通過minval 和maxval選項分別修改。針對常用的分布選 項,Keras還提供了兩個基於這個分布的特例 即glorot_uniform和he_uniform。前者均勻分布 的上下限是輸入向量和輸出向量的維度的函 數:minval / maxval = -/ + √(6/(n1+n2))。 而在后者 上下限只是輸入向量的維度的函數:minval / maxval = -/ + √(6/n1)
- 自定義,用戶可以自定義一個與參數維度相 符合的初始化函數。下面的例子來自於Keras 手冊,使用后台的正態分布函數生成一組初 始值,在定義網絡層的時候調用這個函數即可。
from keras import backend as k from keras.models import Sequential from keras.layers import Dense , Activation def my_init(shape , dtype = None): return k.random_normal(shape,dtype = dtype) model = Sequential() model.add(Dense(64,kernel_initializer = my_init))
3、正則化
在神經網絡中提供了正則化的手段,分別應用於權重參數、偏置項以及激活函數,對應的選項分別是kernel_regularizer、bias_reuglarizier和activity_regularizer。它們都可以應用Keras.regularizier.Regularizer對象,這個對象提供了定義好的一階、二階和混合的正則化方法,分別將前面的Regularizier替換為l1(x)、 l2(x)和l1_l2(x1,x2),其中x或者x1,x2為 非負實數,表明正則化的權重。
自定義權重矩陣的正則項,接受權重矩陣為參數,並且輸出單個數值即可。
from keras import backend as K from keras.models import Sequential from keras.layers import Dense , Activation model = Sequential() def l1_reg(weight_matrix): return 0.01 * K.sum(K.abs(weight_matrix)) model.add(Dense(64, input_dim=64, kernel_regularizer=l1_reg))
在這個例子中,用戶自己定義了一個比例為 0.01的一階正則化項,返回的單個數值是權重參 數的絕對值的和,乘以0.01這個比例,其用法跟 預先提供的regularizier.l1(x)對象是一樣的。
六、模型的保存和讀取:keras中的模型主要包括model結構和weight兩個部分。
- 讀取模型需要導入的包:from keras.models import load_model
- 保存和讀取整個模型【包括model結構和參數】:
model.save('my_model.h5') #取個名字,h5是保存的格式,需要安裝HDF5模塊,pip install h5py
model = load_model(’my_model.h5') #讀取模型
- 僅保存和讀取權重參數【不保存model結構】:
model.save_weights('my_model_weights.h5') #保存
model.load_weights('my_model_weights.h5') #讀取
- 僅保存和讀取模型的結構【不保存權重參數】:
from keras.models import model_from_json
#保存模型
- 刪除已經存在模型:
del model
- 遷移學習時只想加載某些權重參數,可以通過層名字來加載模型:
model.load_weights('my_model_weights.h5', by_name=True)
參考:
Keras快速上手:基於Python的深度學習實戰
Keras中文手冊