使用顺序API

时间:2018-12-19 02:01:38

标签: python machine-learning keras keras-layer autoencoder

我正在训练使用Keras中的Sequential API构造的自动编码器。我想创建实现编码和解码功能的单独模型。我从examples知道如何使用功能性API来做到这一点,但是我找不到使用顺序API来完成此事的示例。以下示例代码是我的起点:

input_dim = 2904
encoding_dim = 4
hidden_dim = 128

# instantiate model
autoencoder = Sequential()

# 1st hidden layer    
autoencoder.add(Dense(hidden_dim, input_dim=input_dim, use_bias=False))
autoencoder.add(BatchNormalization())
autoencoder.add(Activation('elu'))
autoencoder.add(Dropout(0.5))

# encoding layer    
autoencoder.add(Dense(encoding_dim, use_bias=False))
autoencoder.add(BatchNormalization())
autoencoder.add(Activation('elu'))
# autoencoder.add(Dropout(0.5))

# 2nd hidden layer    
autoencoder.add(Dense(hidden_dim, use_bias=False))
autoencoder.add(BatchNormalization())
autoencoder.add(Activation('elu'))
autoencoder.add(Dropout(0.5))

# output layer
autoencoder.add(Dense(input_dim))

我意识到我可以使用autoencoder.layer[i]选择单个图层,但是我不知道如何将新模型与一系列此类图层相关联。我天真地尝试了以下方法:

encoder = Sequential()
for i in range(0,7):
    encoder.add(autoencoder.layers[i])

decoder = Sequential()
for i in range(7,12):
    decoder.add(autoencoder.layers[i])


print(encoder.summary())
print(decoder.summary())

似乎适用于编码器部分(显示了有效的摘要),但解码器部分产生了错误:

This model has not yet been built. Build the model first by calling build() or calling fit() with some data. Or specify input_shape or batch_input_shape in the first layer for automatic build.

2 个答案:

答案 0 :(得分:0)

由于未明确设置中间层(即,我指的是autoencoder.layers[7])的输入形状,因此当您将其添加到另一模型作为第一层时,该模型将不会自动构建(即构建过程涉及为模型中的各层构建权重张量)。因此,您需要显式调用build方法并设置输入形状:

decoder.build(input_shape=(None, encoding_dim))   # note that batch axis must be included

请注意,由于print会自行打印结果,因此无需在model.summary()上调用{{1}}。

答案 1 :(得分:0)

另一种可行的方法。

input_img = Input(shape=(encoding_dim,))
previous_layer = input_img
for i in range(bottleneck_layer,len(autoencoder.layers)): # bottleneck_layer = index of bottleneck_layer + 1!
    next_layer = autoencoder.layers[i](previous_layer)
    previous_layer = next_layer
decoder = Model(input_img, next_layer)