【717】Keras报错'NoneType' object has no attribute '_inbound_nodes'
参考:‘NoneType‘ object has no attribute ‘_inbound_nodes‘解决方法汇总
问题原因
出现上图所示是因为在Keras的网络中一切都是要用层来表示,即当网络中一些keras.backend库中的函数如batch_dot、repeat_elements、Subtract、expand_dims函数、当直接使用tensorflow的一些运算函数如tf.matmul等时,均不是Keras中网络的层的概念,故会出现这种情况。
解决方法
解决方法为将自己所需的函数包装成keras的层。
最简单的解决方法就是把所有相乘、相加、数组操作以及相关函数,都用 Lambda 进行修改,注意所有的都要修改!
我自己的代码,我是拆解了,一行一行比对出来的。实际上 Multiple、Add 是可以的,但是直接用“+”就是不行的,这个之前一直没注意!
原函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | def GFM(F_Net1, F_Net2, channel, G_input): F_Net1 = Conv2D(channel, 1 , padding = 'same' )(F_Net1) F_Net2 = Conv2D(channel, 1 , padding = 'same' )(F_Net2) F_Net_Cat = Concatenate(axis = 3 )([F_Net1, F_Net2]) F_Net_Cat = Conv2D(channel, 3 , activation = 'relu' , padding = 'same' )(F_Net_Cat) F_Net_Cat = Conv2D(channel, 3 , activation = 'relu' , padding = 'same' )(F_Net_Cat) F_Net_Cat = Conv2D( 2 , 1 , padding = 'same' )(F_Net_Cat) G_input = UpSampling2D(size = ( 2 , 2 ))(G_input) F_G_Add = add([G_input, F_Net_Cat]) F_G_SoftMax = Conv2D( 2 , 1 , activation = "softmax" )(F_G_Add) G_Net1 = F_G_SoftMax[:,:,:, 0 ] G_Net2 = F_G_SoftMax[:,:,:, 1 ] G_Net1 = K.expand_dims(G_Net1, - 1 ) G_Net2 = K.expand_dims(G_Net2, - 1 ) A_F = multiply([F_Net1, G_Net1]) + multiply([F_Net2, G_Net2]) G_output = F_G_Add return A_F, G_output |
改写后的函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | def GFM(F_Net1, F_Net2, channel, G_input): F_Net1 = Conv2D(channel, 1 , padding = 'same' )(F_Net1) F_Net2 = Conv2D(channel, 1 , padding = 'same' )(F_Net2) F_Net_Cat = Concatenate(axis = 3 )([F_Net1, F_Net2]) F_Net_Cat = Conv2D(channel, 3 , activation = 'relu' , padding = 'same' )(F_Net_Cat) F_Net_Cat = Conv2D(channel, 3 , activation = 'relu' , padding = 'same' )(F_Net_Cat) F_Net_Cat = Conv2D( 2 , 1 , padding = 'same' )(F_Net_Cat) G_input = UpSampling2D(size = ( 2 , 2 ))(G_input) F_G_Add = Add()([G_input, F_Net_Cat]) F_G_SoftMax = Conv2D( 2 , 1 , activation = "softmax" )(F_G_Add) # 转换为下面的形式 G_Net1 = Lambda( lambda x: x[:,:,:, 0 ])(F_G_SoftMax) G_Net2 = Lambda( lambda x: x[:,:,:, 1 ])(F_G_SoftMax) G_Net1 = Lambda( lambda x: K.expand_dims(x, - 1 ))(G_Net1) G_Net2 = Lambda( lambda x: K.expand_dims(x, - 1 ))(G_Net2) # 以下两种写法都可以 A_F1 = Multiply()([F_Net1, G_Net1]) A_F2 = Multiply()([F_Net2, G_Net2]) A_F = Add()([A_F1, A_F2]) #A_F1 = Lambda(lambda x: multiply([x[0], x[1]]))([F_Net1, G_Net1]) #A_F2 = Lambda(lambda x: multiply([x[0], x[1]]))([F_Net2, G_Net2]) #A_F = Lambda(lambda x: add([x[0], x[1]]))([A_F1, A_F2]) G_output = F_G_Add return A_F, G_output |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
2021-05-31 【569】LaTex, arrows over letters
2021-05-31 【568】review
2021-05-31 【567】Convert LaTex to Word Using Pandoc
2012-05-31 【043】光盘库编码