我正在开发一个自动编码器,用于对某些图像组进行聚类。
input_images->...->bottleneck->...->output_images
我已经校准了自动编码器,使其满意并保存了模型;一切都是使用python3上的keras.tensorflow开发的。
下一步是将自动编码器应用于大量图像,并根据瓶颈层中的余弦距离对它们进行聚类。哎呀,我刚刚意识到我不知道 keras.tf 语法,用于批量运行模型到特定层而不是输出层。因此问题:
如何运行类似Model.predict_on_batch
或Model.predict_generator
到某个"瓶颈"层并检索该层上的值而不是输出层上的值?
您需要定义一个新模型(如果最初未将编码器和解码器定义为单独的模型,这通常是最简单的选择(。
如果您的模型是在没有重用层的情况下定义的,则只需:
inputs = model.input
outputs= model.get_layer('bottleneck').output
encoder = Model(inputs, outputs)
像使用任何其他模型一样使用encoder
模型。
完整的代码是这样的,
# ENCODER
encoding_dim = 37310
input_layer = Input(shape=(encoding_dim,))
encoder = Dense(500, activation='tanh')(input_layer)
encoder = Dense(100, activation='tanh')(encoder)
encoder = Dense(50, activation='tanh', name='bottleneck_layer')(encoder)
decoder = Dense(100, activation='tanh')(encoder)
decoder = Dense(500, activation='tanh')(decoder)
decoder = Dense(37310, activation='sigmoid')(decoder)
# full model
model_full = models.Model(input_layer, decoder)
model_full.compile(optimizer='adam', loss='mse')
model_full.fit(x, y, epochs=20, batch_size=16)
# bottleneck model
bottleneck_output = model_full.get_layer('bottleneck_layer').output
model_bottleneck = models.Model(inputs = model_full.input, outputs = bottleneck_output)
bottleneck_predictions = model_bottleneck.predict(X_test)