AttributeError:“NoneType”对象没有属性“_inbound_nodes”

Posted

技术标签:

【中文标题】AttributeError:“NoneType”对象没有属性“_inbound_nodes”【英文标题】:AttributeError: 'NoneType' object has no attribute '_inbound_nodes' 【发布时间】:2019-01-01 18:04:32 【问题描述】:

我想实现 loss function 在这里定义。 我使用 fcn-VGG16 得到一个图 x,并添加一个激活层。(x 是 fcn vgg16 网络的输出)。然后只是一些操作来获取提取的特征。

co_map = Activation('sigmoid')(x)
#add mean values
img = Lambda(AddMean, name = 'addmean')(img_input)
#img map multiply
img_o = Lambda(HighLight,  name='highlightlayer1')([img, co_map])
img_b = Lambda(HighLight,  name='highlightlayer2')([img, 1-co_map])

extractor = ResNet50(weights = 'imagenet', include_top = False, pooling = 'avg')
extractor.trainable = False
extractor.summary()

o_feature = extractor(img_o)
b_feature = extractor(img_b)
loss = Lambda(co_attention_loss,name='name')([o_feature,b_feature])
model = Model(inputs=img_input, outputs= loss ,name='generator')

我得到的错误是在这一行model = Model(inputs=img_input, outputs= loss ,name='generator') 我认为是因为我计算损失的方式使其不是 keras 模型可接受的输出。

def co_attention_loss(args):
loss = []
o_feature,b_feature = args
c = 2048
for i in range(5):
    for j in range(i,5):
        if i!=j:
            print("feature shape : "+str(o_feature.shape))
            d1 = K.sum(K.pow(o_feature[i] - o_feature[j],2))/c
            d2 = K.sum(K.pow(o_feature[i] - b_feature[i],2))
            d3 = K.sum(K.pow(o_feature[j] - b_feature[j],2))
            d4 = d2 + d3/(2*c)
            p = K.exp(-d1)/K.sum([K.exp(-d1),K.exp(-d4)])
            loss.append(-K.log(p)) 
return K.sum(loss)

如何修改我的损失函数以使其正常工作?

【问题讨论】:

【参考方案1】:
loss = Lambda(co_attention_loss,name='name')([o_feature,b_feature])

表示你输入的 args 是一个列表,但是你把 args 称为一个元组

o_feature,b_feature = args

您可以将丢失代码更改为

def co_attention_loss(args):
    loss = []
    o_feature = args[0]
    b_feature = args[1]
    c = 2048
    for i in range(5):
        for j in range(i,5):
            if i!=j:
                print("feature shape : "+str(o_feature.shape))
                d1 = K.sum(K.pow(o_feature[i] - o_feature[j],2))/c
                d2 = K.sum(K.pow(o_feature[i] - b_feature[i],2))
                d3 = K.sum(K.pow(o_feature[j] - b_feature[j],2))
                d4 = d2 + d3/(2*c)
                p = K.exp(-d1)/K.sum([K.exp(-d1),K.exp(-d4)])
                loss.append(-K.log(p)) 
return K.sum(loss)

注意:未测试

【讨论】:

我发现对于减法 [1-co_map],我必须将其包裹为一个图层。但是感谢您提醒 args 部分。

以上是关于AttributeError:“NoneType”对象没有属性“_inbound_nodes”的主要内容,如果未能解决你的问题,请参考以下文章

AttributeError:'NoneType'对象没有属性'upper'[关闭]

%Matplotlib - AttributeError: 'NoneType' 对象没有属性 'lower'

BeautifulSoup:AttributeError:“NoneType”对象没有属性“文本”

Elastic Beanstalk 部署错误:AttributeError :: 'NoneType' 对象没有属性 'split'

AttributeError:“NoneType”对象没有“当前”属性

每次我使用 pip 时都会出现“AttributeError:'NoneType'”