‘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)