在密集层之前连接输入。 [带有TF后端的Keras]

时间:2019-01-08 14:27:22

标签: tensorflow keras conv-neural-network vgg-net

因此,在进入密集层之前,我需要将输入连接到平坦层。 我正在使用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。

在执行model.fit时如何将此aux_input添加到模型中?

根据答案中的建议,我使用功能性api更改了模型。但是,现在,出现以下错误。

  

ValueError:层密_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 :(得分:0)

正如我从您的代码中看到的那样,您使用sequential API实现模型,在这种情况下,这不是一个好选择。如果您有一些辅助输入,则实现此功能的最佳方法是使用functional API

这里是example from Keras website

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)