錯誤原因與提示
我在使用keras搭建模型時,需要使用TensorFlow夾雜搭建,但是keras無論使用函數式還是序列式,每一層的輸出類型都是layer類型 ,所以當你使用非keras函數時,得到的變量類型不是layer類型,因此會報下面的錯誤:
File "..\lib\site-packages\keras\engine\network.py", line 1325, in build_map
node = layer._inbound_nodes[node_index]
AttributeError: 'NoneType' object has no attribute '_inbound_nodes'
解決辦法
解決方法就是將自定義層的輸出變爲keras layer類型,實現也很簡單,就是調用keras中的Lambda函數。
下面以簡單的案例舉例說明如何解決:
方法一
from tensorflow import squeeze
from keras.layers import Lambda
def squeeze_dim(input):
output = squeeze(input, axis = [1,2])
def my_model(inputs):
x = Conv2d(inputs)
...
# 只需要使用Lambda調用預定義好的函數即可
x = Lambda(squeeze_dim, name='sqe_dim')(x)
model = Model(input = inputs, output = x)
...
方法二
from tensorflow import squeeze
from keras.layers import Lambda
def my_model(inputs):
x = Conv2d(inputs)
...
# 直接使用Lambda將函數包裹
x = Lambda(lambda x: squeeze(x, axis = [1,2]) )
model = Model(input = inputs, output = x)
...