天天看點

keras入門一

"""基于MLP的softmax多分類(十分類)"""

import keras
#引入序列模型模型
from keras.models import Sequential
#引入全連接配接層、
# 随機失活(引入随機失活後,神經網絡的每個節點都會貢獻内容,不會出現少數高權重節點完全控制輸出結果的情況,是以降低了網絡的結構風險)
# 激活層(沒有直接用到,在全連接配接層間接用到)
from keras.layers import Dense, Dropout, Activation
#引入SGD優化
from keras.optimizers import SGD

# 生成虛拟資料
import numpy as np
#生成一個1000*20維的向量
x_train = np.random.random((1000, 20))
#生成一個1000*10維的向量
#先通過np生成一個1000*1維的其值為0-9的矩陣,然後再通過 keras.utils.to_categorical 方法擷取成一個1000*10維的二進制矩陣。
#one hot 對類型标簽進行編碼
y_train = keras.utils.to_categorical(np.random.randint(10, size=(1000, 1)), num_classes=10)

x_test = np.random.random((100, 20))
y_test = keras.utils.to_categorical(np.random.randint(10, size=(100, 1)), num_classes=10)


#建構序列模型
model = Sequential()
# Dense(64) 是一個具有 64 個隐藏神經元的全連接配接層。
# 在第一層必須指定所期望的輸入資料尺寸:
# 在這裡,是一個 20 維的向量。
model.add(Dense(64, activation='relu', input_dim=20))

#放棄層,将在訓練過程中每次更新參數時随機斷開一定百分比的輸入神經元,防止過拟合
model.add(Dropout(0.5))
model.add(Dense(64, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax'))

#優化算法為SGD
#lr  大于0的浮點數  學習率
#momentum  大于0的浮點數  動量參數
#decay  大于0的浮點數   每次更新後的浮點數衰減值
#nesterov: 布爾值  确定是否使用Nesterov動量
sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)

#對模型預編譯,其損失函數為多類别交叉熵,優化算法為SGD,評估方法為多類别準确度和平均絕對誤差
#優化器optimizer: 指定為已預定義的優化器名
#loss:試圖最小化的目标函數
# metrisc:分類問題一般設定為metrics=['accuracy']
model.compile(loss='categorical_crossentropy',
              optimizer=sgd,
              metrics=['accuracy'])

#fit函數傳回一個history對象,其中history.history屬性記錄了損失函數和其他名額的數值随epoch變化的情況
model.fit(x_train, y_train,
          epochs=20,
          batch_size=128)

#模型評估
score = model.evaluate(x_test, y_test, batch_size=128)      

keras.layers.core.Dense(units, activation=None, use_bias=True, kernel_initializer='glorot_uniform', bias_initializer='zeros', kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, bias_constraint=None, **kwargs)

Dense就是常用的全連接配接層,所實作的運算是output = activation(dot(input, kernel)+bias)。其中activation是逐元素計算的激活函數,kernel是本層的權值矩陣,bias為偏置向量,隻有當use_bias=True才會添加。 

如果本層的輸入資料的次元大于2,則會先被壓為與kernel相比對的大小。 

但是我們更關注的是參數的含義:

units:大于0的整數,代表該層的輸出次元。

activation:激活函數,為預定義的激活函數名(參考激活函數),或逐元素(element-wise)的Theano函數。如果不指定該參數,将不會使用任何激活函數(即使用線性激活函數:a(x)=x)

use_bias: 布爾值,是否使用偏置項

kernel_initializer:權值初始化方法,為預定義初始化方法名的字元串,或用于初始化權重的初始化器。參考initializers

bias_initializer:權值初始化方法,為預定義初始化方法名的字元串,或用于初始化權重的初始化器。參考initializers

kernel_regularizer:施加在權重上的正則項,為Regularizer對象

bias_regularizer:施加在偏置向量上的正則項,為Regularizer對象

activity_regularizer:施加在輸出上的正則項,為Regularizer對象

kernel_constraints:施加在權重上的限制項,為Constraints對象

bias_constraints:施加在偏置上的限制項,為Constraints對象

而這裡我們看到了一個不同,那就是輸入的單元input_dim沒有出現在定義中,其實它藏在了**kwargs中,因為源碼中這樣寫道:

if 'input_shape' not in kwargs and 'input_dim' in kwargs:

            kwargs['input_shape'] = (kwargs.pop('input_dim'),)

這裡就有出現問題了,什麼是

input_dim

input_shape

。他們的差別在于,如果是2D張量,則可以使用

input_dim

即可,但是如果是三維的話,可能就需要

input_length

來幫忙了,具體來講,他們之間的聯系是:

input_dim = input_shape(input_dim,)

input_dim, input_length = input_shape(input_length, input_dim,)

#像我們上面例子中的就是一個20維的資料,但是如果是識别手寫體的話,你的原始資料是二維的,比如這個是 (28, 28) = 784,這個是mnist的手寫資料。2維資料可以看成是1維的,那1維的shape就是(28*28,)了。

常用激活函數:

softmax 

這是歸一化的多分類,可以把K維實數域壓縮到(0,1)的值域中,并且使得K個數值和為1。

sigmoid 

這時歸一化的二進制分類,可以把K維實數域壓縮到近似為0,1二值上。

relu 

這也是常用的激活函數,它可以把K維實數域映射到[0,inf)區間。

tanh 

這時三角雙曲正切函數,它可以把K維實數域映射到(-1,1)區間。

 Dropout層

它的原型為:

keras.layers.core.Dropout(rate, noise_shape=None, seed=None)

1

正如上面所述,為輸入資料施加Dropout。Dropout将在訓練過程中每次更新參數時随機斷開一定百分比(rate)的輸入神經元,Dropout層用于防止過拟合。

其參數含義如下:

rate:0~1的浮點數,控制需要斷開的神經元的比例。

noise_shape:整數張量,為将要應用在輸入上的二值Dropout mask的shape,例如你的輸入為(batch_size, timesteps, features),并且你希望在各個時間步上的Dropout mask都相同,則可傳入noise_shape=(batch_size, 1, features)。

seed:整數,使用的随機數種子 

優化算法

優化算法最常用的為SGD算法,也就是随機梯度下降算法。這裡我們不多講,因為優化算法我們會單開一章來總結一下所有的優化算法。

這裡我們隻講這裡用到的SGD,它的原型為:

keras.optimizers.SGD(lr=0.01, momentum=0.0, decay=0.0, nesterov=False)

  • lr:大于0的浮點數,學習率
  • momentum:大于0的浮點數,動量參數
  • decay:大于0的浮點數,每次更新後的學習率衰減值
  • nesterov:布爾值,确定是否使用Nesterov動量

模型的訓練

fit(self, x, y, batch_size=32, epochs=10, verbose=1, callbacks=None, validation_split=0.0, validation_data=None, shuffle=True, class_weight=None, sample_weight=None, initial_epoch=0)

x:輸入資料。如果模型隻有一個輸入,那麼x的類型是numpy array,如果模型有多個輸入,那麼x的類型應當為list,list的元素是對應于各個輸入的numpy array

y:标簽,numpy array

batch_size:整數,指定進行梯度下降時每個batch包含的樣本數。訓練時一個batch的樣本會被計算一次梯度下降,使目标函數優化一步。

epochs:整數,訓練的輪數,每個epoch會把訓練集輪一遍。

verbose:日志顯示,0為不在标準輸出流輸出日志資訊,1為輸出進度條記錄,2為每個epoch輸出一行記錄

callbacks:list,其中的元素是keras.callbacks.Callback的對象。這個list中的回調函數将會在訓練過程中的适當時機被調用,參考回調函數

validation_split:0~1之間的浮點數,用來指定訓練集的一定比例資料作為驗證集。驗證集将不參與訓練,并在每個epoch結束後測試的模型的名額,如損失函數、精确度等。注意,validation_split的劃分在shuffle之前,是以如果你的資料本身是有序的,需要先手工打亂再指定validation_split,否則可能會出現驗證集樣本不均勻。

validation_data:形式為(X,y)的tuple,是指定的驗證集。此參數将覆寫validation_spilt。

shuffle:布爾值或字元串,一般為布爾值,表示是否在訓練過程中随機打亂輸入樣本的順序。若為字元串“batch”,則是用來處理HDF5資料的特殊情況,它将在batch内部将資料打亂。

class_weight:字典,将不同的類别映射為不同的權值,該參數用來在訓練過程中調整損失函數(隻能用于訓練)

sample_weight:權值的numpy array,用于在訓練時調整損失函數(僅用于訓練)。可以傳遞一個1D的與樣本等長的向量用于對樣本進行1對1的權重,或者在面對時序資料時,傳遞一個的形式為(samples,sequence_length)的矩陣來為每個時間步上的樣本賦不同的權。這種情況下請确定在編譯模型時添加了sample_weight_mode=’temporal’。

initial_epoch: 從該參數指定的epoch開始訓練,在繼續之前的訓練時有用。

模型的評估

evaluate(self, x, y, batch_size=32, verbose=1, sample_weight=None)

x:輸入資料,與fit一樣,是numpy array或numpy array的list

y:标簽,numpy array

batch_size:整數,含義同fit的同名參數

verbose:含義同fit的同名參數,但隻能取0或1

sample_weight:numpy array,含義同fit的同名參數

轉自:

--------------------- 

作者:劉炫320 

來源:CSDN 

原文:https://blog.csdn.net/qq_35082030/article/details/77170284 

版權聲明:本文為部落客原創文章,轉載請附上博文連結!

繼續閱讀