keras常用代碼模塊介紹——layer模塊

相比TensorFlow,keras更加簡(jiǎn)便易學(xué),學(xué)習(xí)成本更低,大家只要做到對(duì)常用代碼模塊有所了解,基本就可以按照自己的思路搭建想要的模型。其實(shí)這個(gè)系列的文章是自己學(xué)習(xí)過(guò)程的筆記而已,部分內(nèi)容摘抄自官網(wǎng),也有很多自己不懂的地方,但也希望能幫助大家快速對(duì)keras有個(gè)認(rèn)識(shí)。

1.通用層

每一個(gè)layer的實(shí)例都可以使用以下方法:

layer.get_weights()#獲取當(dāng)前層的權(quán)重
layer.set_weights()#從numpy中載入權(quán)重
layer.get_config()#獲取當(dāng)前層配置信息
layer.input#獲取當(dāng)前層的輸入
layer.output#獲取當(dāng)前層的輸出
layer.input_shape#獲取當(dāng)前層的輸入形狀
layer.output_shape#獲取當(dāng)前層的輸出形狀

通用層的方法其本質(zhì)都是為了讓你檢查數(shù)據(jù)、保存數(shù)據(jù)用的,方便中間代碼的調(diào)試過(guò)程。

2.高級(jí)激活層

說(shuō)到高級(jí)激活了,應(yīng)該會(huì)比較高大上,其實(shí)就是對(duì)常用的RELU、TANH等函數(shù)進(jìn)行一下稍微的改變而已。這個(gè)層封裝在keras.layers.advanced_activations里,具體有啥來(lái)看一下:

keras.layers.advanced_activations.LeakyReLU(alpha=0.3)#x<0返回x*alpha,x>0返回x
keras.layers.advanced_activations.PReLU(alpha_initializer='zeros', alpha_regularizer=None, alpha_constraint=None, shared_axes=None)#規(guī)則和上一個(gè)相同,只不過(guò)這個(gè)時(shí)候的alpha變?yōu)榱艘粋€(gè)和x相同形狀的、可訓(xùn)練的向量
keras.layers.advanced_activations.ELU(alpha=1.0)#x<0時(shí),f(x) = alpha * (exp(x) - 1.), x>=0時(shí),f(x) = x
keras.layers.advanced_activations.ThresholdedReLU(theta=1.0)#x > theta時(shí),f(x) = x,x<= theata時(shí),f(x) = 0

3.卷積層

這一層只有做卷積神經(jīng)網(wǎng)絡(luò)的時(shí)候才有用,卷積的方法也是千千萬(wàn)萬(wàn),但是基本思路是一樣的。這一層的方法都在keras.layers.convolutional里,具體的方法方面明顯參數(shù)變多了。最常用的是Conv1D和Conv2D。

keras.layers.convolutional.Conv1D(filters, kernel_size, strides=1, padding='valid', dilation_rate=1, 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)#參數(shù)不重要,和我們講卷積神經(jīng)網(wǎng)絡(luò)原理時(shí)看到的一樣。
keras.layers.convolutional.Conv2D(filters, kernel_size, strides=(1, 1), padding='valid', data_format=None, dilation_rate=(1, 1), 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)#對(duì)二維參數(shù)的卷積,就是處理圖像的時(shí)候經(jīng)常用
keras.layers.convolutional.Conv3D(filters, kernel_size, strides=(1, 1, 1), padding='valid', data_format=None, dilation_rate=(1, 1, 1), 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)#三維卷積,也是針對(duì)圖像來(lái)的
keras.layers.convolutional.SeparableConv2D(filters, kernel_size, strides=(1, 1), padding='valid', data_format=None, depth_multiplier=1, activation=None, use_bias=True, depthwise_initializer='glorot_uniform', pointwise_initializer='glorot_uniform', bias_initializer='zeros', depthwise_regularizer=None, pointwise_regularizer=None, bias_regularizer=None, activity_regularizer=None, depthwise_constraint=None, pointwise_constraint=None, bias_constraint=None)#可分離卷積,就是卷積過(guò)程分兩步,可能是計(jì)算效率更高。
keras.layers.convolutional.Conv2DTranspose(filters, kernel_size, strides=(1, 1), padding='valid', data_format=None, 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è)反卷積的情況,就是講卷積以后的向量反向變換回去。

除此之外,卷積層里還有很多輔助的方法,可以幫助開(kāi)發(fā)者做各種操作。

keras.layers.convolutional.Cropping1D(cropping=(1, 1))#參數(shù)為在指定的位置要裁多少元素
keras.layers.convolutional.Cropping2D(cropping=((0, 0), (0, 0)), data_format=None)#圖像元素的裁剪
keras.layers.convolutional.Cropping3D(cropping=((1, 1), (1, 1), (1, 1)), data_format=None)#三維方向進(jìn)行裁剪
keras.layers.convolutional.UpSampling1D(size=2)#將元素重復(fù)多少步
keras.layers.convolutional.UpSampling2D(size=(2, 2), data_format=None)#將元素在二維方向上重復(fù)多少步
keras.layers.convolutional.UpSampling3D(size=(2, 2, 2), data_format=None)#講元素在三維方向上重復(fù)多少步
keras.layers.convolutional.ZeroPadding1D(padding=1)#一維方向首尾填充0
keras.layers.convolutional.ZeroPadding2D(padding=(1, 1), data_format=None)#二維方向首尾填充0
keras.layers.convolutional.ZeroPadding2D(padding=(1, 1), data_format=None)#三維方向首尾填充0

4.池化層

池化層緊跟卷積層,是對(duì)數(shù)據(jù)降維的一個(gè)過(guò)程,常用的最大池化和平均池化,但是有學(xué)者證明最大池化效果更好,所以通常采用最大池化。

keras.layers.MaxPooling2D(pool_size=(2, 2), strides=None, padding='valid', data_format=None)
keras.layers.AveragePooling2D(pool_size=(2, 2), strides=None, padding='valid', data_format=None)
keras.layers.GlobalMaxPooling2D(data_format=None)
keras.layers.GlobalAveragePooling2D(data_format=None)

global的池化一般用于最后一層,就是將每一個(gè)特征圖作為一個(gè)特征點(diǎn),然后可以避免送入全連接層的元素太多,有時(shí)候也可以替代全連接層使用。

5.其他常用層

這些層都在keras.layers.core,基本建模涉及到數(shù)據(jù)的轉(zhuǎn)換和處理的時(shí)候都會(huì)用到這些層。

5.1 dense層

全連接層就是實(shí)現(xiàn)點(diǎn)乘加偏置操作

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)

5.2 Activation層

把激活函數(shù)加入這一層

keras.layers.core.Activation(activation)

5.3 Dropout層

為了要減少操作要經(jīng)常性的刪除一些不用的元素,dropout層就是以一定概率刪除一些層

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

5.4 Flatten層

這個(gè)和numpy的flatten是一樣的,就是將多維數(shù)據(jù)拉平,方便后續(xù)操作。

keras.layers.core.Flatten()

5.5 Reshape層

這個(gè)是對(duì)輸入的形狀進(jìn)行重排,排列成自己想要成為的樣子。

keras.layers.core.Reshape(target_shape)

5.6 Permute層

維度交換層,兩個(gè)維護(hù)互相交換,為了計(jì)算方便,可以滿足矩陣乘法的法則。RNN和CNN進(jìn)行連接的時(shí)候可能會(huì)用到該層,這一層的其他使用場(chǎng)景也很多。

keras.layers.core.Permute(dims)

5.7 RepeatVector層

將輸入重復(fù)n次。

keras.layers.core.RepeatVector(n)

5.8 Lambda層

這個(gè)lambda和lambda表達(dá)式的lambda是一樣的,用于推廣函數(shù)應(yīng)用的。

keras.layers.core.Lambda(function, output_shape=None, mask=None, arguments=None)

5.9 ActivityRegularizer

對(duì)權(quán)重加l1和l2損失的。

keras.layers.core.ActivityRegularization(l1=0.0, l2=0.0)

5.10 Masking層

在神經(jīng)網(wǎng)絡(luò)或者說(shuō)人工智能里,mask都是都是屏蔽信號(hào)用的,就是說(shuō)到了這一步計(jì)算不起作用。

keras.layers.core.Masking(mask_value=0.0)

6 embedding層

這個(gè)層是一個(gè)詞向量嵌入的層,怎么說(shuō)更好呢,就是你有一堆詞,扔進(jìn)embedding里就成了用一堆向量表示的詞,一個(gè)詞用好幾個(gè)數(shù)字表示。embedding層是這樣的,keras.layers.embeddings。

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

7.LocallyConnceted

局部連接層,和卷積很像,只不過(guò)是權(quán)重不共享,每一部分用的權(quán)值都是不同的。這一層放在keras.layers.local里。

7.1 LocallyConnected1D層

和Conv1D類(lèi)似,同樣權(quán)值是不共享的。

keras.layers.local.LocallyConnected1D(filters, kernel_size, strides=1, padding='valid', data_format=None, 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)

7.2 LocallyConnected2D層

和Conv2D類(lèi)似,同樣權(quán)值是不共享的。

keras.layers.local.LocallyConnected2D(filters, kernel_size, strides=(1, 1), padding='valid', data_format=None, 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)

8.Merge層

Merge層用于兩個(gè)張量的拼接,也是比較常用的操作,都是layer里已大寫(xiě)字母開(kāi)頭的方法。

8.1 Add層

顧名思義,兩個(gè)相同維度的張量相加,返回一個(gè)新的tensor。

keras.layers.Add()

8.2 SubStract層

這一層和add相對(duì)應(yīng),是減的,返回的也是一個(gè)新tensor。

keras.layers.SubStract()

8.3 Multiply層

這個(gè)乘法到了keras都是點(diǎn)乘,就是元素乘

keras.layers.Multiply()

8.4 Average層

返回平均值

keras.layers.Average()

8.5 Maximum層

返回逐元素對(duì)比的最大值

keras.layers.Maximum()

8.6 Concatenate層

按照指定的軸將tensor拼接到一起,axis=0行拼接,axis=-1列拼接

keras.layers.Concatenate(axis = -1)

8.7 Dot層

dot在神經(jīng)網(wǎng)絡(luò)中的意思是對(duì)應(yīng)位置相乘相加,所以dot層就是相乘相加的一個(gè)過(guò)程。

keras.layers.Dot(axes, normalize=False)

8.8 add層

Add層的函數(shù)式包裝,方便使用和運(yùn)算。

keras.layers.add(inputs)#inputs是兩個(gè)以上的張量

同理8.2-8.7都有這么一個(gè)包裝函數(shù),看你需要自己使用。

9.Noise層

這一層是為了增加模型的魯棒性而添加的,方法都包裝在keras.layers.noise這里邊。

9.1 GaussianNoise層

加入符合正態(tài)分布的噪聲,主要是為防止過(guò)擬合。

keras.layers.noise.GaussianNoise(stddev)

9.2 GaussianDropout層

加入以1為均值,標(biāo)準(zhǔn)差為sqrt(rate/(1-rate)的乘性高斯噪聲,只在訓(xùn)練時(shí)候起作用。

keras.layers.noise.GaussianDropout(rate)

9.3 Alpha Dropout層

Alpha Dropout是一種保持輸入均值和方差不變的Dropout,具體用法尚未探索到,先留著,后續(xù)解決。

keras.layers.noise.AlphaDropout(rate, noise_shape=None, seed=None)

10.規(guī)范化層

做標(biāo)準(zhǔn)化用的,將數(shù)據(jù)轉(zhuǎn)化到0-1之間。

keras.layers.normalization.BatchNormalization(axis=-1, momentum=0.99, epsilon=0.001, center=True, scale=True, beta_initializer='zeros', gamma_initializer='ones', moving_mean_initializer='zeros', moving_variance_initializer='ones', beta_regularizer=None, gamma_regularizer=None, beta_constraint=None, gamma_constraint=None)

11.recurrent層

這一個(gè)是針對(duì)循環(huán)神經(jīng)網(wǎng)絡(luò)的層,里邊包括了RNN、LSTM等,全都封裝在keras.layers.recurrent里。

11.1 Recurrent層

這個(gè)是recurrent層的抽象,不能直接用。

keras.layers.recurrent.Recurrent(return_sequences=False, go_backwards=False, stateful=False, unroll=False, implementation=0)

這里這個(gè)return_sequences是關(guān)鍵參數(shù),為False是輸出最后一層的參數(shù),為T(mén)rue是輸出所有層的參數(shù)。

11.2 SimpleRNN層

簡(jiǎn)單的RNN。

keras.layers.SimpleRNN(units, activation='tanh', recurrent_activation='hard_sigmoid', use_bias=True, kernel_initializer='glorot_uniform', recurrent_initializer='orthogonal', bias_initializer='zeros', kernel_regularizer=None, recurrent_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, recurrent_constraint=None, bias_constraint=None, dropout=0.0, recurrent_dropout=0.0, implementation=1, return_sequences=False, return_state=False, go_backwards=False, stateful=False, unroll=False)

11.2 GRU層

rnn的改進(jìn),參數(shù)和SimpleRnn差不多。

keras.layers.recurrent.GRU(units, activation='tanh', recurrent_activation='hard_sigmoid', use_bias=True, kernel_initializer='glorot_uniform', recurrent_initializer='orthogonal', bias_initializer='zeros', kernel_regularizer=None, recurrent_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, recurrent_constraint=None, bias_constraint=None, dropout=0.0, recurrent_dropout=0.0)

11.3 LSTM層

rnn的另一種改進(jìn)。

keras.layers.recurrent.LSTM(units, activation='tanh', recurrent_activation='hard_sigmoid', use_bias=True, kernel_initializer='glorot_uniform', recurrent_initializer='orthogonal', bias_initializer='zeros', unit_forget_bias=True, kernel_regularizer=None, recurrent_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, recurrent_constraint=None, bias_constraint=None, dropout=0.0, recurrent_dropout=0.0)

11.4 ConvLSTM2D層

ConvLSTM2D是一個(gè)LSTM網(wǎng)絡(luò),但它的輸入變換和循環(huán)變換是通過(guò)卷積實(shí)現(xiàn)的,這個(gè)不太理解,也不咋用。

keras.layers.ConvLSTM2D(filters, kernel_size, strides=(1, 1), padding='valid', data_format=None, dilation_rate=(1, 1), activation='tanh', recurrent_activation='hard_sigmoid', use_bias=True, kernel_initializer='glorot_uniform', recurrent_initializer='orthogonal', bias_initializer='zeros', unit_forget_bias=True, kernel_regularizer=None, recurrent_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, recurrent_constraint=None, bias_constraint=None, return_sequences=False, go_backwards=False, stateful=False, dropout=0.0, recurrent_dropout=0.0)

11.5 SimpleRNN/GRU/LSTMCell層

cell類(lèi),其實(shí)就是將一個(gè)細(xì)胞單元表示出來(lái)。

keras.layers.LSTMCell(units, activation='tanh', recurrent_activation='hard_sigmoid', use_bias=True, kernel_initializer='glorot_uniform', recurrent_initializer='orthogonal', bias_initializer='zeros', unit_forget_bias=True, kernel_regularizer=None, recurrent_regularizer=None, bias_regularizer=None, kernel_constraint=None, recurrent_constraint=None, bias_constraint=None, dropout=0.0, recurrent_dropout=0.0, implementation=1)

11.6 StackedRNNCells層

將多個(gè)層包裝成一個(gè)層。

keras.layers.StackedRNNCells(cells)

11.7 CuDNNGRU/LSTM層

基于CuDNN的快速GRU/LSTM實(shí)現(xiàn),只能在GPU上運(yùn)行,只能使用tensoflow為后端

keras.layers.CuDNNGRU(units, kernel_initializer='glorot_uniform', recurrent_initializer='orthogonal', bias_initializer='zeros', kernel_regularizer=None, recurrent_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, recurrent_constraint=None, bias_constraint=None, return_sequences=False, return_state=False, stateful=False)

12.Wrapper層

用于給各個(gè)層進(jìn)行相關(guān)的包裝操作。

12.1 TimeDistributed層

該包裝器可以把一個(gè)層應(yīng)用到輸入的每一個(gè)時(shí)間步上。

keras.layers.wrappers.TimeDistributed(layer)

12.2 Bidirectional層

用于包裝雙向RNN和LSTM。

keras.layers.wrappers.Bidirectional(layer, merge_mode='concat', weights=None)

此外你還可以編寫(xiě)自己的層,給一個(gè)小案例進(jìn)行參考。

from keras import backend as K
from keras.engine.topology import Layer
import numpy as np

class MyLayer(Layer):

    def __init__(self, output_dim, **kwargs):
        self.output_dim = output_dim
        super(MyLayer, self).__init__(**kwargs)

    def build(self, input_shape):
        # Create a trainable weight variable for this layer.
        self.kernel = self.add_weight(name='kernel', 
                                      shape=(input_shape[1], self.output_dim),
                                      initializer='uniform',
                                      trainable=True)
        super(MyLayer, self).build(input_shape)  # Be sure to call this somewhere!

    def call(self, x):
        return K.dot(x, self.kernel)

    def compute_output_shape(self, input_shape):
        return (input_shape[0], self.output_dim)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容