Многоголовая модель в Керасе - ошибка при слиянии

Я пытаюсь реализовать многоголовую модель с переменным количеством входов одномерных данных, каждый из которых имеет длину sps.

Поэтому я определяю вход в цикле, который позже объединяется в единую модель. И получить ошибку

dense = (Dense(locChannels, activation=locActivation, input_shape=merged.output_shape)) (merged)

AttributeError: объект «Тензор» не имеет атрибута «output_shape»

Если я удалю параметр input_shape из плотного объекта, я получу следующее:

Предупреждение пользователя: входные данные модели должны поступать из keras.layers.Input (таким образом, они содержат метаданные предыдущего слоя), они не могут быть выходными данными предыдущего не входного слоя. Здесь тензор, указанный в качестве входных данных для вашей модели, не был входным тензором, он был сгенерирован слоем flatten_1. Обратите внимание, что входные тензоры создаются через tensor = keras.layers.Input(shape).

У вас есть идеи, как это исправить?

Я думаю, мне следует уточнить, как выглядят мои данные. Может быть, у меня есть ошибка в моей структуре.

locChannels — это количество различных функций, которые у меня есть. Каждая функция является 1D и содержит точные выборки sps. Желаемый результат — one-hot-coded-array.

differentModels = list()

for index in range (0,locChannels):
    name = 'Input_'+str(index)
    visible = Input(shape=(sps,1), name=name)
    cnn1 = Conv1D(filters=8,kernel_size=2, activation=locActivation) (visible)
    cnn1 = MaxPooling1D(pool_size = 2) (cnn1)
    cnn1 = Flatten()(cnn1)
    #print(visible)
    differentModels.append(cnn1)

merged = Concatenate()(differentModels)
dense = (Dense(locChannels, activation=locActivation, input_shape=merged.output_shape)) (merged)

for index in range (2,locLayers):
    dense = (Dropout(rate=locDropoutRate)) (dense)
    dense = (Dense(locChannels, activation=locActivation, input_shape=(locChannels,))) (dense)
output = Dense(units=locClasses, activation='softmax')(dense)

model = Model(inputs=differentModels, outputs= output)

person geojanm    schedule 26.09.2018    source источник
comment
Вам нужно Concatenate()(differentModels).   -  person Kota Mori    schedule 26.09.2018
comment
Спасибо за подсказку, я изменил это, но получил новую ошибку, как указано выше.   -  person geojanm    schedule 27.09.2018


Ответы (1)


Я только что узнал, в чем была моя ошибка. В линии

model = Model(inputs=differentModels, outputs= output)

Вход должен быть головным или входным слоем, а не последним. Итак, следующее работает, как и ожидалось:

inputheads = list()
myinputs = list()

for index in range(0,features):
    input_a = Input(shape=(sps,1),name='Input_'+str(index))
    cnn1 = Conv1D(filters=8,kernel_size=2, activation='selu') (input_a)
    cnn1 = MaxPooling1D(pool_size = 2) (cnn1)
    cnn1 = Flatten()(cnn1)
    inputheads.append(cnn1)
    myinputs.append(input_a)

merged = Concatenate() (inputheads)
dense = Dense(20)(merged)
predictions = Dense(10, activation='softmax')(dense)
model = Model(inputs=myinputs, outputs=predictions)
person geojanm    schedule 27.09.2018