【问题标题】:AttributeError: 'NoneType' object has no attribute '_inbound_nodes' while trying to add multiple keras Dense layersAttributeError:“NoneType”对象在尝试添加多个 keras 密集层时没有属性“_inbound_nodes”
【发布时间】:2018-09-21 17:38:28
【问题描述】:

输入是 1000 个特征的 3 个独立通道。我试图通过一个独立的 NN 路径传递每个通道,然后将它们连接成一个平面层。然后在 flatten 层上应用 FCN 进行二进制分类。 我正在尝试将多个 Dense 图层添加在一起,如下所示:

def tst_1():

inputs = Input((3, 1000, 1))

dense10 = Dense(224, activation='relu')(inputs[0,:,1])
dense11 = Dense(112, activation='relu')(dense10)
dense12 = Dense(56, activation='relu')(dense11)

dense20 = Dense(224, activation='relu')(inputs[1,:,1])
dense21 = Dense(112, activation='relu')(dense20)
dense22 = Dense(56, activation='relu')(dense21)

dense30 = Dense(224, activation='relu')(inputs[2,:,1])
dense31 = Dense(112, activation='relu')(dense30)
dense32 = Dense(56, activation='relu')(dense31)

flat = keras.layers.Add()([dense12, dense22, dense32])

dense1 = Dense(224, activation='relu')(flat)
drop1 = Dropout(0.5)(dense1)
dense2 = Dense(112, activation='relu')(drop1)
drop2 = Dropout(0.5)(dense2)
dense3 = Dense(32, activation='relu')(drop2)
densef = Dense(1, activation='sigmoid')(dense3)

model = Model(inputs = inputs, outputs = densef)

model.compile(optimizer=Adam(), loss='binary_crossentropy', metrics=['accuracy'])

return model
model = tst_1()

model.summary()

但我收到了这个错误:

/usr/local/lib/python2.7/dist-packages/keras/engine/network.pyc in build_map(tensor, finished_nodes, nodes_in_progress, layer, node_index, tensor_index) 1310 ValueError:如果检测到循环。 第1311章 -> 1312 节点 = layer._inbound_nodes[node_index] 1313 1314 # 防止循环。

AttributeError: 'NoneType' 对象没有属性 '_inbound_nodes'

【问题讨论】:

  • 您应该添加更多信息:例如,您要完成什么,数据集的性质,预处理...... model.summaty 的输出也很有用
  • 输入为1000个观察的3个独立通道。我试图通过一个独立的 NN 路径传递每个通道,然后将它们连接成一个平面层。然后在 flatten 层上应用 FCN 进行二分类。
  • 那么...为什么要添加而不是连接?公寓的大小会很不一样。
  • 我应用了连接但我得到了同样的错误。我猜 Add() 在这里做同样的事情,因为输入是一维张量。

标签: python tensorflow keras


【解决方案1】:

问题是使用inputs[0,:,1]分割输入数据不是作为keras层来完成的。

您需要创建一个Lambda 层才能完成此操作。

以下代码:

from keras import layers
from keras.layers import Input, Add, Dense,Dropout, Lambda, Concatenate
from keras.layers import Flatten
from keras.optimizers import Adam
from keras.models import Model
import keras.backend as K


def tst_1(): 

    num_channels = 3
    inputs = Input(shape=(num_channels, 1000, 1))

    branch_outputs = []
    for i in range(num_channels):
        # Slicing the ith channel:
        out = Lambda(lambda x: x[:, i, :, :], name = "Lambda_" + str(i))(inputs)

        # Setting up your per-channel layers (replace with actual sub-models):
        out = Dense(224, activation='relu', name = "Dense_224_" + str(i))(out)
        out = Dense(112, activation='relu', name = "Dense_112_" + str(i))(out)
        out = Dense(56, activation='relu', name = "Dense_56_" + str(i))(out)
        branch_outputs.append(out)

    # Concatenating together the per-channel results:
    out = Concatenate()(branch_outputs)


    dense1 = Dense(224, activation='relu')(out)
    drop1 = Dropout(0.5)(dense1)
    dense2 = Dense(112, activation='relu')(drop1)
    drop2 = Dropout(0.5)(dense2)
    dense3 = Dense(32, activation='relu')(drop2)
    densef = Dense(1, activation='sigmoid')(dense3)

    model = Model(inputs = inputs, outputs = densef)

    return model

Net = tst_1()
Net.compile(optimizer=Adam(), loss='binary_crossentropy', metrics=['accuracy'])

Net.summary()

正确创建了您想要的网络。

【讨论】:

  • 感谢您的回复。但是crop函数的输出是(3,1),而应该是(1000,1)。
  • 我从你的回答中得到了想法,并以这种方式解决了它:
  • @Sam_Ha 修改了代码以实现您需要的功能。
【解决方案2】:

感谢@CAta.RAy

我是这样解决的:

import numpy as np
from keras import layers
from keras.layers import Input, Add, Dense,Dropout, Lambda
from keras.layers import Flatten
from keras.optimizers import Adam
from keras.models import Model
import keras.backend as K




def tst_1(): 
    inputs = Input((3, 1000))

    x1 = Lambda(lambda x:x[:,0])(inputs)
    dense10 = Dense(224, activation='relu')(x1)
    dense11 = Dense(112, activation='relu')(dense10)
    dense12 = Dense(56, activation='relu')(dense11)

    x2 = Lambda(lambda x:x[:,1])(inputs)
    dense20 = Dense(224, activation='relu')(x2)
    dense21 = Dense(112, activation='relu')(dense20)
    dense22 = Dense(56, activation='relu')(dense21)

    x3 = Lambda(lambda x:x[:,2])(inputs)
    dense30 = Dense(224, activation='relu')(x3)
    dense31 = Dense(112, activation='relu')(dense30)
    dense32 = Dense(56, activation='relu')(dense31)

    flat = Add()([dense12, dense22, dense32])

    dense1 = Dense(224, activation='relu')(flat)
    drop1 = Dropout(0.5)(dense1)
    dense2 = Dense(112, activation='relu')(drop1)
    drop2 = Dropout(0.5)(dense2)
    dense3 = Dense(32, activation='relu')(drop2)
    densef = Dense(1, activation='sigmoid')(dense3)

    model = Model(inputs = inputs, outputs = densef)

    return model

Net = tst_1()
Net.compile(optimizer=Adam(), loss='binary_crossentropy', metrics=['accuracy'])

Net.summary()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-23
    • 2019-03-21
    • 2019-09-02
    • 1970-01-01
    • 2019-01-01
    • 2019-12-08
    • 1970-01-01
    • 2019-04-25
    相关资源
    最近更新 更多