淺談keras中的Merge層(實現(xiàn)層的相加、相減、相乘實例)
【題目】keras中的Merge層(實現(xiàn)層的相加、相減、相乘)
詳情請參考:
一、層相加
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如何將某一層的神經(jīng)元拆分以便進一步操作(如取輸入的向量的第一個元素乘別的層)?keras如何重用某一層的值(如輸入層和輸出層乘積作為最終輸出)?
這些問題都指向同一個答案,即使用Lambda層。
另外,如果想要更加靈活地操作層的話,推薦使用函數(shù)式模型寫法,而不是序列式。
Keras當中,任何的操作都是以網(wǎng)絡層為單位,操作的實現(xiàn)都是新添一層,不管是加減一個常數(shù)還是做乘法,或者是對兩層的簡單拼接。
所以,將一層單獨劈一半出來,是一件難事。強調(diào),Keras的最小操作單位是Layer,每次操作的是整個batch。
自然,在keras中,每個層都是對象,可以通過dir(Layer對象)來查看具有哪些屬性。
然而,Backend中Tensorflow的最小操作單位是Tensor,而你搞不清楚到底是Layer和Tensor時,盲目而想當然地進行層的操作,就會出問題。到底是什么?通過type和shape是看不出來的。
如果你只是想對流經(jīng)該層的數(shù)據(jù)做個變換,而這個變換本身沒有什么需要學習的參數(shù),那么直接用Lambda Layer是最合適的了。
也就是說,對每一層的加減乘除都得用keras的函數(shù),你不能簡單使用形如 ‘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))
乍一看,有點懵逼,什么亂七八糟的。事實上,很簡單,假設(shè)L0和L1是兩層,你只要將你形如下面這樣的表達:
L1 = F(L0);
改成
L1 = Lambda( lambda L0:F(L0) ) (L0)
即可。為了看得清楚,多加了幾個空格。
事實上,無非就是將原來的變換,通過Lambda(lambda 輸入:表達式)這樣的方式,改成了Lambda型函數(shù),再把輸入傳進去,放在尾巴上即可。
參考
https://keras-cn.readthedocs.io/en/latest/layers/core_layer/#lambda
(個人覺得這份文檔某些地方比官方中文要完整許多)
keras許多簡單操作,都需要新建一個層,使用Lambda可以很好完成需求。當你不知道有這個東西存在的時候,就會走不少彎路。
以上這篇淺談keras中的Merge層(實現(xiàn)層的相加、相減、相乘實例)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
- DataFrame 數(shù)據(jù)合并實現(xiàn)(merge,join,concat)
- 關(guān)于keras中keras.layers.merge的用法說明
- C++實現(xiàn)歸并排序(MergeSort)
- 源碼解析JDK 1.8 中的 Map.merge()
- 詳解Python3 pandas.merge用法
- 詳解PANDAS 數(shù)據(jù)合并與重塑(join/merge篇)
- pandas dataframe的合并實現(xiàn)(append, merge, concat)
- CentOS7.4開機出現(xiàn)welcome to emergency mode的解決方法
- JPA merge聯(lián)合唯一索引無效問題解決方案
相關(guān)文章
linux環(huán)境打包python工程為可執(zhí)行程序的過程
本次需求,在ubuntu上面開發(fā)的python代碼程序需要打包成一個可執(zhí)行程序然后交付給甲方,因為不能直接給源碼給甲方,所以尋找方法將python開發(fā)的源碼打包成一個可執(zhí)行程序,本次在ubuntu上打包python源碼的方法和在window上打包的有點類似,感興趣的朋友跟隨小編一起看看吧2024-01-01pytorch常用數(shù)據(jù)類型所占字節(jié)數(shù)對照表一覽
這篇文章主要介紹了pytorch常用數(shù)據(jù)類型所占字節(jié)數(shù)對照表一覽,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-05-05Python使用pandas和openpyxl讀取Excel表格的方法詳解
這篇文章主要介紹了Python讀取Excel表格數(shù)據(jù)的方法,Python提供了多種讀取Excel文件的方式,最常用的庫是pandas和openpyxl,下面我將詳細介紹如何使用這兩個庫來讀取Excel文件,并包含一些實用示例,需要的朋友可以參考下2024-10-10python在Windows下安裝setuptools(easy_install工具)步驟詳解
這篇文章主要介紹了python在Windows下安裝setuptools(easy_install工具)步驟,簡單介紹了setuptools并分析了其安裝步驟與所涉及的相關(guān)軟件,需要的朋友可以參考下2016-07-07