Объединить вход перед плотным слоем. [Керас с бэкэндом TF] - PullRequest
0 голосов
/ 08 января 2019

Итак, мне нужно объединить вход в сплющенный слой перед переходом в плотный слой. Я использую Keras с TF в качестве бэкэнда.

model.add(Flatten())
aux_input = Input(shape=(1, )) 
model.add(Concatenate([model, aux_input])) 
model.add(Dense(512,kernel_regularizer=regularizers.l2(weight_decay)))

У меня есть такой сценарий: X_train, y_train, aux_train. Форма y_train и aux_train одинакова (1,). Изображение имеет правду и aux_input.

Как мне добавить этот aux_input к модели при выполнении model.fit?

Как и предлагалось в ответах, я сменил модель на функциональный API. Однако теперь я получаю следующую ошибку.

ValueError: Слой density_1 вызывался с входом, который символический тензор. Полученный тип:. Полный ввод: []. Все входы в слой должны быть тензорами.

Вот код этой части.

flatten = Flatten()(drop_5)
aux_rand = Input(shape=self.aux_shape)
concat = Concatenate([flatten, aux_input])

fc1 = Dense(512, kernel_regularizer=regularizers.l2(weight_decay))(concat)

Форма вспомогательного входа

aux_shape = (1,)

А затем вызывать модель следующим образом

(x_train, y_train), (x_test, y_test) = cifar10.load_data()
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')

aux_rand = np.random.rand(y_train.shape[0])
model_inst = cifar10vgg()
x_train_input = Input(shape=(32,32,3))
aux_input = Input(shape=(1,))
model = Model(inputs=[x_train_input, aux_input], output=model_inst.build_model())
model.fit(x=[x_train, aux_rand], y=y_train, batch_size=batch_size, steps_per_epoch=x_train.shape[0] // batch_size,
                epochs=maxepoches, validation_data=(x_test, y_test),
                callbacks=[reduce_lr, tensorboard], verbose=2)

model_inst.build_model () возвращает Activation('softmax')(fc2), который является выходом для подачи в модель (насколько я понял)

1 Ответ

0 голосов
/ 08 января 2019

Как я вижу из вашего кода, вы реализуете модель с последовательным API , что в данном случае не является хорошим вариантом. Если у вас есть некоторые вспомогательные входы, лучший способ реализовать такую ​​функцию - использовать функциональный API .

Вот пример с сайта Keras :

from keras.layers import Input, Embedding, LSTM, Dense
from keras.models import Model

main_input = Input(shape=(100,), dtype='int32', name='main_input')

x = Embedding(output_dim=512, input_dim=10000, input_length=100)(main_input)

lstm_out = LSTM(32)(x)

auxiliary_output = Dense(1, activation='sigmoid', name='aux_output')(lstm_out)
auxiliary_input = Input(shape=(5,), name='aux_input')
x = keras.layers.concatenate([lstm_out, auxiliary_input])

x = Dense(64, activation='relu')(x)

main_output = Dense(1, activation='sigmoid', name='main_output')(x)

model = Model(inputs=[main_input, auxiliary_input], outputs=[main_output, auxiliary_output])

Основываясь на описании, я думаю, что следующий код может дать вам некоторую интуицию:

x1 = Input(shape=(32, 32, 3))
flatten1 = Flatten()(x1)

x2 = Input(shape=(244, 244, 3))
vgg = VGG19(weights='imagenet', include_top=False)(x2)
flatten2 = Flatten()(vgg)

concat = Concatenate()([flatten1, flatten2])
d = Dense(10)(concat)

model = Model(inputs=[x1, x2], outputs=[d])
model.compile('adam', 'categorical_crossentropy')
model.fit(x=[x_train1, x_train2],outputs=y_labels)
...