‘NoneType‘ object has no attribute ‘_inbound_nodes‘解决方法汇总

‘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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值