AttributeError: у объекта 'NoneType' нет атрибута '_inbound_nodes' при попытке добавить несколько слоев Keras. Плотные слои - PullRequest
0 голосов
/ 21 сентября 2018

На входе находятся 3 независимых канала с 1000 функциями.Я пытаюсь пропустить каждый канал через независимый путь NN, а затем объединить их в плоский слой.Затем нанесите FCN на ровный слой для двоичной классификации.Я пытаюсь добавить несколько плотных слоев вместе, например:

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 в build_map (тензор, конечные_узлы, node_in_progress, слой, node_index, tenor_index) 1310 ValueError: если обнаружен цикл.1311 "" "-> 1312 node = layer._inbound_nodes [node_index] 1313 1314 # Предотвращать циклы.

AttributeError: у объекта 'NoneType' нет атрибута '_inbound_nodes'

Ответы [ 2 ]

0 голосов
/ 22 сентября 2018

Благодаря @ 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()
0 голосов
/ 21 сентября 2018

Проблема заключается в том, что разделение входных данных с использованием 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()

правильно создал нужную сеть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...