Python 属性错误:';非类型';对象没有属性'_入站节点';尝试添加多个keras密集层时

Python 属性错误:';非类型';对象没有属性'_入站节点';尝试添加多个keras密集层时,python,tensorflow,keras,Python,Tensorflow,Keras,输入为3个独立通道,共1000个功能。我试图让每个通道通过一个独立的NN路径,然后将它们连接到一个平面层中。然后在展平层上应用FCN进行二元分类。 我尝试将多个致密层添加到一起,如下所示: def tst_1(): 但我有一个错误: /usr/local/lib/python2.7/dist-packages/keras/engine/network.pyc in build\u map(张量、完成的节点、进行中的节点、层、节点索引、张量索引) 1310值错误:如果检测到循环。 1311

输入为3个独立通道,共1000个功能。我试图让每个通道通过一个独立的NN路径,然后将它们连接到一个平面层中。然后在展平层上应用FCN进行二元分类。 我尝试将多个致密层添加到一起,如下所示:

def tst_1():

但我有一个错误:

/usr/local/lib/python2.7/dist-packages/keras/engine/network.pyc in build\u map(张量、完成的节点、进行中的节点、层、节点索引、张量索引) 1310值错误:如果检测到循环。 1311 """ ->1312节点=层。\入站\节点[节点\索引] 1313 1314#防止循环

AttributeError:“非类型”对象没有属性“\u入站节点”


问题在于,使用
输入[0,:,1]
拆分输入数据不是作为keras层完成的

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

以下代码:

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()
正确创建了所需的网络


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

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

以下代码:

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()
正确创建了所需的网络

谢谢@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()
感谢@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()

您应该添加更多信息:例如,您试图完成什么,数据集的性质,预处理…model.summaty的输出也会有用。输入是3个独立的通道,共1000个观测值。我试图通过一个独立的NN路径传递每个通道,然后将它们连接到一个平面层中。然后应用FCN在二元分类的扁平化层上。那么…为什么要添加而不是连接?扁平化的大小将非常不同。我应用了连接,但我得到了相同的错误。我想添加()这里做的事情与输入是1D张量相同。你应该添加更多信息:例如,你想完成什么,数据集的性质,预处理…model.summaty的输出也会有用。输入是3个独立的通道,共1000个观测值。我试图通过一个独立的NN路径传递每个通道,然后将它们连接到一个平面层。然后在平面层上应用FCN进行二进制分类。然后…为什么要添加而不是连接?平面的大小将非常不同。我应用了连接,但我得到了相同的错误。我猜Add()在这里做同样的事情,因为输入是1D张量。谢谢你的回答。但是裁剪函数的输出是(3,1),而它应该是(1000,1)。我从你的回答中得到了想法,并用以下方式解决:@samuha修改了代码以允许你需要的功能。谢谢你的回答。但是裁剪函数的输出是(3,1),而它应该是(1000,1)。我从你的回答中得到了这个想法,并通过以下方式解决:@Sam_Ha修改了代码,以允许使用你需要的功能。