ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

【717】Keras报错'NoneType' object has no attribute '_inbound_nodes'

2022-05-31 22:03:09  阅读:181  来源: 互联网

标签:no 717 Cat padding 报错 Conv2D Net Net2 Net1


参考:‘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 是可以的,但是直接用“+”就是不行的,这个之前一直没注意!

原函数:

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

 

改写后的函数:

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

 

标签:no,717,Cat,padding,报错,Conv2D,Net,Net2,Net1
来源: https://www.cnblogs.com/alex-bn-lee/p/16332445.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有