1. 程式人生 > 其它 >‘NoneType‘ object has no attribute ‘_inbound_nodes‘解決方法彙總

‘NoneType‘ object has no attribute ‘_inbound_nodes‘解決方法彙總

技術標籤: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中網路的層的概念,故會出現這種情況。

3.解決方法
解決方法為將自己所需的函式包裝成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)