‘NoneType‘ object has no attribute ‘_inbound_nodes‘解決方法彙總
阿新 • • 發佈:2021-01-03
技術標籤:keras深度學習tensorflow
‘NoneType‘ object has no attribute ‘_inbound_nodes‘解決方法彙總
之前使用tensorflow框架,這兩天使用keras框架,好傢伙,冒出個這個錯誤,看了許多教程,總結一下,本文總分為如下三部分。
- 問題描述
- 問題原因
- 解決方法
1.問題描述
如下圖:
2.問題原因
出現上圖所示是因為在Keras的網路中一切都是要用層來表示,即當網路中一些keras.backend庫中的函式如batch_dot、repeat_elements、Subtract、expand_dims函式、當直接使用tensorflow的一些運算函式如tf.matmul等時,均不是Keras中網路的層的概念,故會出現這種情況。
解決方法為將自己所需的函式包裝成keras的層。
有如下兩種方式:
(1)第一種:
首先定義一個函式,函式返回的便為我們所需的運算。再用Lambda定義一個層。
例如當我想使用expand_dims時,先定義函式如下:
def expand_dim(x):
x1=K.expand_dims(x,axis=-1)
return x1
再在需要使用時,使用Lambda定義層:
x = Lambda(expand_dim)(x)
便可解決類似問題
(2)第二種:
直接使用python的lamda進行修改。例如當我想使用expand_dims時,直接使用
x = Lambda( lambda x: K.expand_dims(x,axis=-1))(x)
這種方式有一個坑,當我們要傳的引數有兩個時就可能會有問題。
例如:當我們使用batch_dot方法時,若使用如下:
s = Lambda(lambda x,y: K.batch_dot(x, y,axes=[2, 2]))(x_batch,y_batch)
會出現下面錯誤:
TypeError: __call__() takes 2 positional arguments but 3 were given
這是因為lambda在這裡希望一個輸入,將上述程式碼改為下面即可。
s=Lambda(lambda x: K.batch_dot(x[0], x[1], axes=[2, 2]))([(x_batch,y_batch)])
最後附上一些有可能使用的方法:
例一:
s=Lambda(lambda x: K.batch_dot(x[0], x[1], axes=[2, 2]))([(x_batch,y_batch)])
例二:
o = Lambda(lambda x: K.reshape(x, (32, 40, 20)))(x_batch)
例三:
Input_T=Lambda(lambda x: K.permute_dimensions(x, (0,3,1,2)))(Input)
例四:
x=Lambda(lambda x, dim: K.repeat_elements(x, dim, axis=2), arguments={'dim': Input.shape[1]})(x)
例五:
def mul(x):
return tf.matmul(x,h)
x = Lambda(mul)(x)
例六:
Input_T=Lambda(lambda x: tf.matmul(x,h))(Input)