关于Keras中,AttributeError NoneType object has no attribute inbound nodes 错误的理解

  • Post author:
  • Post category:其他


最近在研究Mask RCNN的相关代码,参照的是博主-叠加态的猫的系列讲解(很详细,很具体)

https://www.cnblogs.com/hellcat/p/9749538.html

这个问题常出现在,使用Keras来进行构图时创建layer的过程中.由于Keras的主要操作都是在layer上进行的,而一般所有对于tensor的操作都需要创建层来进行处理.具体使用方法可以参照Keras官方中文手册:

https://keras.io/zh/layers/core/#lambda

.常见的可以写成a=KL.Lambda(lambda x: 调用函数(x))(要输入到函数里的实参),对于多个要输入参数的可以写成a=KL.Lambda(lambda x:调用函数(*x))([实参1,实参2…])

而在后续的工作中,由于要对程序进行修改,添加对于输出的相关处理.根据我的Config得到的输入变量为Tensor类型,且大小为(?,32,224,224,2).我参照上述写法完成了子网构建,不过仍然报上述错误.我仔细看了所有方法的调用,包括K.mean,K.file等,实际都已经使用Lambda进行封装了,不过仍然存在上述的中断.后来,我通过在系统文件network.py中的构图命令build_map()循环中添加输出node.inbound_layers[i].name,打印了添加入图中的layer的name.初步判断是在mrcnn=KL.Lambda(lambda x: K.mean(x, axis=1),name=”mrcnn_lambda_1″)(mrcnn)[:,:,:,1:]这句话存在问题.查了很久的资料都没有看到相关的问题,经过我一!!天!!的尝试,我才知道,原来在Keras中,对于Tensor的切片操作,也要用Lambda进行封装??如果随意使用切片[…],仍然会导致layer插入中断在切片位置!!!!!

至于解决方案,可以将要使用的切片写成函数,在通过Lambda进行封装,如我这里是定义了一个函数:

def slice_our(x):return x[:,:,:,1:]

然后将上面的命令写成mrcnn=KL.Lambda(lambda x: K.mean(x, axis=1),name=”mrcnn_lambda_1″)(mrcnn)

mrcnn=KL.Lambda(lambda x: slice_our(x),name=”mrcnn_lambda_slice”)(mrcnn)

被这个问题困住了一天,最后还是没办法查到了network.py里去了T.T

之前一直在用Tensorflow,这次因为Mask RCNN这个项目才接触的Keras,感觉Keras的部分封装比较便利,但还是有很多东西要学呀!!!还有就是,运行效率不怎么高啊!!!!!!=.=



版权声明:本文为Winder_Sky原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。