有没有办法将Keras中给定(中间)层的输出用作另一个网络的输入?

时间:2018-09-25 22:13:34

标签: python tensorflow machine-learning keras deep-learning

是否可以使用Keras中给定(中间)层的输出作为另一个网络的输入?

例如,使用编码器的最后一个密集层作为另一个网络的输入?

#encoder
encoder = keras.models.Sequential()
encoder.add(L.InputLayer(img_shape))
encoder.add(L.Conv2D(32, kernel_size=(3, 3),strides=1, padding='same', activation='elu'))
encoder.add(L.MaxPool2D(pool_size=(2, 2)))
encoder.add(L.Conv2D(64, kernel_size=(3, 3),strides=1, padding='same', activation='elu'))
encoder.add(L.MaxPool2D(pool_size=(2, 2)))
encoder.add(L.Conv2D(128, kernel_size=(3, 3),strides=1, padding='same', activation='elu'))
encoder.add(L.MaxPool2D(pool_size=(2, 2)))
encoder.add(L.Conv2D(256, kernel_size=(3, 3),strides=1, padding='same', activation='elu'))
encoder.add(L.MaxPool2D(pool_size=(2, 2)))
encoder.add(L.Flatten())
encoder.add(L.Dense(code_size))


    # decoder
decoder = keras.models.Sequential()
decoder.add(L.InputLayer((code_size,)))
decoder.add(L.Dense(147456))
decoder.add(L.Reshape((24, 24, 256)))
decoder.add(L.Conv2DTranspose(filters=128, kernel_size=(3, 3), strides=2, activation='elu', padding='same'))
decoder.add(L.Conv2DTranspose(filters=64, kernel_size=(3, 3), strides=2, activation='elu', padding='same'))
decoder.add(L.Conv2DTranspose(filters=32, kernel_size=(3, 3), strides=2, activation='elu', padding='same'))
decoder.add(L.Conv2DTranspose(filters=1, kernel_size=(3, 3), strides=2, activation=None, padding='same'))

2 个答案:

答案 0 :(得分:0)

如果您只是想将网络的编码层用作输入(即,在训练模型的其余部分时,您不想通过反向传播来更改编码器网络的权重)对于所有示例,您都可以使用keras模型上的predict_generator方法获取解码器网络最后一层的输出,并将其用作预测器网络的输入数据。

答案 1 :(得分:0)

您尝试使用此

decoder = keras.models.Sequential()(encoder)