中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

keras中的Merge層的詳細解析

發布時間:2020-07-22 14:35:11 來源:億速云 閱讀:443 作者:小豬 欄目:開發技術

這篇文章主要講解了keras中的Merge層的詳細解析,內容清晰明了,對此有興趣的小伙伴可以學習一下,相信大家閱讀完之后會有幫助。

【題目】keras中的Merge層(實現層的相加、相減、相乘)

詳情請參考:

Merge層

一、層相加

keras.layers.Add()

添加輸入列表的圖層。

該層接收一個相同shape列表張量,并返回它們的和,shape不變。

Example

import keras
 
input1 = keras.layers.Input(shape=(16,))
x1 = keras.layers.Dense(8, activation='relu')(input1)
input2 = keras.layers.Input(shape=(32,))
x2 = keras.layers.Dense(8, activation='relu')(input2)
added = keras.layers.Add()([x1, x2]) # equivalent to added = keras.layers.add([x1, x2])
 
out = keras.layers.Dense(4)(added)
model = keras.models.Model(inputs=[input1, input2], outputs=out)

二、層相減

SubStract

keras.layers.Subtract()

兩個輸入的層相減。

它將大小至少為2,相同Shape的列表張量作為輸入,并返回一個張量(輸入[0] - 輸入[1]),也是相同的Shape。

Example

import keras
 
input1 = keras.layers.Input(shape=(16,))
x1 = keras.layers.Dense(8, activation='relu')(input1)
input2 = keras.layers.Input(shape=(32,))
x2 = keras.layers.Dense(8, activation='relu')(input2)
# Equivalent to subtracted = keras.layers.subtract([x1, x2])
subtracted = keras.layers.Subtract()([x1, x2])
 
out = keras.layers.Dense(4)(subtracted)
model = keras.models.Model(inputs=[input1, input2], outputs=out)

三、層相乘

Multiply

keras.layers.Multiply()

該層接收一個列表的同shape張量,并返回它們的逐元素積的張量,shape不變。

注意:keras.layers.add(inputs)、keras.layers.subtract(inputs)、keras.layers.multiply(inputs)分別是對應的層包裝,一般只用層包裝。

補充知識:Keras天坑:想當然的對層的直接運算帶來的問題

天坑

keras如何操作某一層的值(如讓某一層的值取反加1等)?keras如何將某一層的神經元拆分以便進一步操作(如取輸入的向量的第一個元素乘別的層)?keras如何重用某一層的值(如輸入層和輸出層乘積作為最終輸出)?

這些問題都指向同一個答案,即使用Lambda層。

另外,如果想要更加靈活地操作層的話,推薦使用函數式模型寫法,而不是序列式。

Keras當中,任何的操作都是以網絡層為單位,操作的實現都是新添一層,不管是加減一個常數還是做乘法,或者是對兩層的簡單拼接。

所以,將一層單獨劈一半出來,是一件難事。強調,Keras的最小操作單位是Layer,每次操作的是整個batch。

自然,在keras中,每個層都是對象,可以通過dir(Layer對象)來查看具有哪些屬性。

然而,Backend中Tensorflow的最小操作單位是Tensor,而你搞不清楚到底是Layer和Tensor時,盲目而想當然地進行層的操作,就會出問題。到底是什么?通過type和shape是看不出來的。

如果你只是想對流經該層的數據做個變換,而這個變換本身沒有什么需要學習的參數,那么直接用Lambda Layer是最合適的了。

也就是說,對每一層的加減乘除都得用keras的函數,你不能簡單使用形如 ‘new_layer' =1−= 1-=1−'layer'這樣的表達方式來對層進行操作。

當遇到如下報錯信息:

AttributeError: 'NoneType' object has no attribute '_inbound_nodes'

TypeError: 'Tensor' object is not callable

等等

這是就要考慮一下將程序中層的操作改成Lambda的方式表達。

使用Lambda編寫自己的層

Lamda層怎么用?官方文檔給了這樣一個例子。

# add a x -> x^2 layer
model.add(Lambda(lambda x: x ** 2))

# add a layer that returns the concatenation
# of the positive part of the input and
# the opposite of the negative part

def antirectifier(x):
  x -= K.mean(x, axis=1, keepdims=True)
  x = K.l2_normalize(x, axis=1)
  pos = K.relu(x)
  neg = K.relu(-x)
  return K.concatenate([pos, neg], axis=1)

def antirectifier_output_shape(input_shape):
  shape = list(input_shape)
  assert len(shape) == 2 # only valid for 2D tensors
  shape[-1] *= 2
  return tuple(shape)

model.add(Lambda(antirectifier,
     output_shape=antirectifier_output_shape))

乍一看,有點懵逼,什么亂七八糟的。事實上,很簡單,假設L0和L1是兩層,你只要將你形如下面這樣的表達:

L1 = F(L0);

改成

L1 = Lambda( lambda L0:F(L0) ) (L0)

即可。為了看得清楚,多加了幾個空格。

事實上,無非就是將原來的變換,通過Lambda(lambda 輸入:表達式)這樣的方式,改成了Lambda型函數,再把輸入傳進去,放在尾巴上即可。

看完上述內容,是不是對keras中的Merge層的詳細解析有進一步的了解,如果還想學習更多內容,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

沛县| 威信县| 开江县| 沭阳县| 安多县| 聂荣县| 沂水县| 鲁山县| 津南区| 大竹县| 鄂尔多斯市| 富民县| 繁峙县| 双牌县| 乃东县| 林西县| 定陶县| 湘阴县| 越西县| 万山特区| 区。| 庆阳市| 荃湾区| 朝阳区| 玉屏| 仁怀市| 孝昌县| 临清市| 利辛县| 响水县| 沈阳市| 固原市| 隆安县| 山西省| 洛川县| 松滋市| 成安县| 化州市| 侯马市| 隆回县| 定兴县|