卷积网络:将隐藏层权重作为输入传递给其他模型

时间:2018-08-11 11:07:46

标签: python tensorflow keras conv-neural-network

我们使用keras,tensorflow构建了一个小cnn。 我们使用keras的功能性API。 我们对传递最后一个卷积层的权重(完全连接的层之前的权重)作为其他cnn的输入感兴趣。

为简单起见,我建议讨论下一个简化的代码:

    from keras.utils import plot_model
    from keras.models import Model
    from keras.layers import Input
    from keras.layers import Dense
    from keras.layers.convolutional import Conv2D
    from keras.layers.pooling import MaxPooling2D
    visible = Input(shape=(64,64,1))
    conv1 = Conv2D(32, kernel_size=4, activation='relu')(visible)
    pool1 = MaxPooling2D(pool_size=(2, 2))(conv1)
    conv2 = Conv2D(16, kernel_size=4, activation='relu')(pool1)
    pool2 = MaxPooling2D(pool_size=(2, 2))(conv2)
    hidden1 = Dense(10, activation='relu')(pool2)
    output = Dense(1, activation='sigmoid')(hidden1)
    model = Model(inputs=visible, outputs=output)
    model.compile(optimizer='Adam',
            loss=['sparse_categorical_crossentropy', None],
            metrics=['accuracy'])
    model.fit(train_dataset,
        train_labels,
        epochs=400,
        batch_size=512,
        validation_data=(valid_dataset, valid_labels),
        verbose=1,
        callbacks=[early_stop])
    # summarize layers
    print(model.summary())
    # plot graph
    plot_model(model, to_file='convolutional_neural_network.png')

问题是:如何使用keras将pool2层作为其他简单模型的输入传递,因此它将与上述第一个模型同时进行训练?

1 个答案:

答案 0 :(得分:1)

一种可能的方法是将其添加到模型中,以便所有内容都包含在以2个分支结尾的单个模型中。 keras中的功能性API允许您根据需要定义层之间的连接,还提供了具有多个输出和损失功能的基础结构。

例如:

from keras.utils import plot_model
from keras.models import Model
from keras.layers import Input
from keras.layers import Dense
from keras.layers.convolutional import Conv2D
from keras.layers.pooling import MaxPooling2D
visible = Input(shape=(64,64,1))
conv1 = Conv2D(32, kernel_size=4, activation='relu')(visible)
pool1 = MaxPooling2D(pool_size=(2, 2))(conv1)
conv2 = Conv2D(16, kernel_size=4, activation='relu')(pool1)
pool2 = MaxPooling2D(pool_size=(2, 2))(conv2)

#add your second model here 
X = FirstLayer()(pool2) #replace with your actual network layer 
# ... 
output2 = YourSecondOutput()(X) 

hidden1 = Dense(10, activation='relu')(pool2)
output = Dense(1, activation='sigmoid')(hidden1)
model = Model(inputs=visible, outputs=[output, output2]) #list of outputs 
model.compile(optimizer='Adam',
        loss=['sparse_categorical_crossentropy', None],
        metrics=['accuracy'])
model.fit(train_dataset,
    train_labels,
    epochs=400,
    batch_size=512,
    validation_data=(valid_dataset, valid_labels),
    verbose=1,
    callbacks=[early_stop])
# summarize layers
print(model.summary())
# plot graph
plot_model(model, to_file='convolutional_neural_network.png')

然后,您只需要更新输入内容以使其适合您,就可以为每个输出都有标签。您可以在multi input and output models

的keras文档中找到更多信息。