官术网_书友最值得收藏!

1.1.2 定義網(wǎng)絡(luò)結(jié)構(gòu)

一般認(rèn)為,深度學(xué)習(xí)訓(xùn)練好的模型包括兩部分,一個(gè)是對(duì)網(wǎng)絡(luò)結(jié)構(gòu)的描述,或者稱為對(duì)網(wǎng)絡(luò)結(jié)構(gòu)的定義;另外一個(gè)是每層網(wǎng)絡(luò)的具體參數(shù)值,這兩部分加起來才是一個(gè)完整的深度學(xué)習(xí)模型。完成數(shù)據(jù)預(yù)處理后,就需要定義網(wǎng)絡(luò)結(jié)構(gòu),或者說對(duì)我們的問題進(jìn)行數(shù)學(xué)建模。

假設(shè)可以通過一條直線,把黑客和正常用戶區(qū)分開,即我們認(rèn)為這個(gè)二分類問題是線性問題,如圖1-1所示。設(shè)特征向量為x,對(duì)應(yīng)的標(biāo)簽為y,使用一個(gè)線性函數(shù)定義整個(gè)網(wǎng)絡(luò):

y=w*x+b

其中w和b就是模型的參數(shù),訓(xùn)練模型的過程就是迭代求解w和b的過程,通常x是一個(gè)多維向量,所以w和b通常也是多維向量。當(dāng)完成了網(wǎng)絡(luò)的定義后,輸入x就可以獲得確定的y,這一過程稱為前向計(jì)算過程,或者稱為前向傳播。面對(duì)更加復(fù)雜的問題,需要使用更加復(fù)雜的層來定義網(wǎng)絡(luò)。定義網(wǎng)絡(luò)時(shí)的常用層包括:Dense層、Activation層、Dropout層、Flatten層、Reshape層和Permute層等。

圖1-1 區(qū)分正常用戶和黑客的二分類問題

1.Dense層

Dense層是最常見的網(wǎng)絡(luò)層,用于構(gòu)建一個(gè)全連接。一個(gè)典型的全連接結(jié)構(gòu)由輸入、求和、激活、權(quán)重矩陣、偏置和輸出組成,如圖1-2所示,訓(xùn)練的過程就是不斷獲得最優(yōu)的權(quán)重矩陣和偏置(bias)的過程。

圖1-2 全連接結(jié)構(gòu)示意圖

了解了全連接的結(jié)構(gòu)后,也不難理解創(chuàng)建Dense層的幾個(gè)參數(shù)了,例如:

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)

其中比較重要的幾個(gè)參數(shù)含義如下。

·units表示隱藏層節(jié)點(diǎn)數(shù)。

·activation(激活函數(shù))詳細(xì)介紹請(qǐng)參見Activation層的相關(guān)內(nèi)容。

·use_bias表示是否使用偏置。

2.Activation層

Actiration層對(duì)一個(gè)層的輸出施加激活函數(shù),常見的激活函數(shù)包括以下幾種。

(1)relu

relu函數(shù)當(dāng)輸入小于0時(shí)為0,當(dāng)輸入大于0時(shí)等于輸入。使用代碼繪制relu的圖像,獲得圖像(見圖1-3)。

def relu(x):
    if x > 0:
        return x
    else:
        return 0
def func4():
    x = np.arange(-5.0, 5.0, 0.02)
    y=[]
    for i in x:
        yi=relu(i)
        y.append(yi)
    plt.xlabel('x')
    plt.ylabel('y relu(x)')
    plt.title('relu')
    plt.plot(x, y)
    plt.show()

圖1-3 relu函數(shù)

(2)leakyrelu

leakyrelu函數(shù)是從relu函數(shù)發(fā)展而來的,當(dāng)輸入小于0時(shí)為輸入乘以一個(gè)很小的系數(shù),比如0.1,當(dāng)輸入大于0時(shí)等于輸入。使用代碼繪制leakyrelu的圖像,獲得圖像(見圖1-4)。

def leakyrelu(x):
    if x > 0:
        return x
    else:
        return x*0.1
def func5():
    x = np.arange(-5.0, 5.0, 0.02)
    y=[]
    for i in x:
        yi=leakyrelu(i)
        y.append(yi)
    plt.xlabel('x')
    plt.ylabel('y leakyrelu(x)')
    plt.title('leakyrelu')
    plt.plot(x, y)
    plt.show()

圖1-4 leakyrelu圖像

(3)tanh

tanh也稱為雙切正切函數(shù),取值范圍為[–1,1]。tanh在特征相差明顯時(shí)的效果會(huì)很好,在循環(huán)過程中會(huì)不斷擴(kuò)大特征效果。tanh的定義如下:

使用代碼繪制tanh的圖像,獲得圖像(見圖1-5)。

x = np.arange(-5.0, 5.0, 0.02)
y=(np.exp(x)-np.exp(-x))/(np.exp(x)+np.exp(-x))
plt.xlabel('x')
plt.ylabel('y tanh(x)')
plt.title('tanh')
plt.plot(x, y)
plt.show()

圖1-5 tanh圖像

(4)sigmoid

sigmoid可以將一個(gè)實(shí)數(shù)映射到(0,1)的區(qū)間,可以用來做二分類。sigmoid的定義如下:

使用代碼繪制sigmoid的圖像,獲得圖像(見圖1-6)。

圖1-6 sigmoid圖像

x = np.arange(-5.0, 5.0, 0.02)
y=1/(1+np.exp(-x))
plt.xlabel('x')
plt.ylabel('y sigmoid(x)')
plt.title('sigmoid')
plt.plot(x, y)
plt.show()

Activation層可以單獨(dú)使用,也可以作為其他層的參數(shù),比如創(chuàng)建一個(gè)輸入大小為784,節(jié)點(diǎn)數(shù)為32,激活函數(shù)為relu的全連接層的代碼為:

model.add(Dense(32, input_shape=(784,)))
model.add(Activation('relu'))

等價(jià)于下列代碼:

model.add(Dense(32, activation='relu',input_shape=(784,)))

3.Dropout層

在深度學(xué)習(xí)中,動(dòng)輒幾萬的參數(shù)需要訓(xùn)練,非常容易造成過擬合,通常為了避免過擬合,會(huì)在每次訓(xùn)練的時(shí)候隨機(jī)選擇一定的節(jié)點(diǎn),使它們臨時(shí)失效,形象的比喻是,好比每次識(shí)別圖像的時(shí)候,隨機(jī)地?fù)踝∫恍┫袼兀趽踹m當(dāng)比例的像素不會(huì)影響圖像的識(shí)別,但是卻可以比較有效地抑制過擬合。Dropout層的定義如下:

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

其中,常用的參數(shù)就是rate,表示臨時(shí)失效的節(jié)點(diǎn)的比例,經(jīng)驗(yàn)值為0.2~0.4比較合適。

4.Embedding層

Embedding層負(fù)責(zé)將輸入的向量按照一定的規(guī)則改變維度,有點(diǎn)類似于Word2Vec的處理方式,把詞可以映射到一個(gè)指定維度的向量中,其函數(shù)定義如下:

keras.layers.Embedding(input_dim, output_dim,
embeddings_initializer='uniform', embeddings_regularizer=None, 
activity_regularizer=None, embeddings_constraint=None, mask_zero=False, 
input_length=None)

其中比較重要的參數(shù)為:

·input_dim:輸入的向量的維度。

·output_dim:輸出的向量的維度。

·embeddings_initializer:初始化的方式,通常使用glorot_normal或者uniform。

5.Flatten層

Flatten層用來將輸入壓平,即把多維的輸入一維化。

6.Permute層

Permute層將輸入的維度按照給定模式進(jìn)行重排。一個(gè)典型場(chǎng)景就是在Keras處理圖像數(shù)據(jù)時(shí),需要根據(jù)底層是TensorFlow還是Theano調(diào)整像素的順序。在TensorFlow中圖像保存的順序是(width,height,channels)而在Theano中則為(channels,width,height),比如MNIST圖像,在TensorFlow中的大小就是(28,28,1),而在Theano中是(1,28,28)。示例代碼如下:

if K.image_dim_ordering() == 'tf':
    # (width, height, channels)
    model.add(Permute((2, 3, 1), input_shape=input_shape))
elif K.image_dim_ordering() == 'th':
    # (channels, width, height)
    model.add(Permute((1, 2, 3), input_shape=input_shape))
else:
    raise RuntimeError('Unknown image_dim_ordering.')

7.Reshape層

Reshape層用于將輸入shape轉(zhuǎn)換為特定的shape。函數(shù)定義如下代碼所示:

keras.layers.core.Reshape(target_shape)

其中target_shape為希望轉(zhuǎn)換成的形狀,比如圖片的大小為(1,28,28,1),但是網(wǎng)絡(luò)的輸入大小為(1,784)時(shí)就需要使用Reshape層。

主站蜘蛛池模板: 巴中市| 博湖县| 漳浦县| 彰化县| 阿拉善右旗| 城步| 五台县| 博野县| 耿马| 泽普县| 开封县| 弋阳县| 哈尔滨市| 于都县| 孝义市| 霍州市| 犍为县| 平潭县| 黔南| 炉霍县| 林口县| 吐鲁番市| 漯河市| 方正县| 云龙县| 安远县| 渭源县| 益阳市| 汾阳市| 丹凤县| 高雄县| 阳原县| 临江市| 万源市| 扬中市| 崇仁县| 德阳市| 华坪县| SHOW| 融水| 鄂尔多斯市|