快速回答:
这实际上非常简单。以下是代码(供那些不想阅读所有文本的人使用):
inputs=Input((784,))encode=Dense(10, input_shape=[784])(inputs)decode=Dense(784, input_shape=[10])model=Model(input=inputs, output=decode(encode))inputs_2=Input((10,))decode_model=Model(input=inputs_2, output=decode(inputs_2))
在这种设置下,decode_model
将使用与 model
相同的解码层。如果你训练 model
,decode_model
也会被训练。
实际问题:
我试图在 Keras 中为 MNIST 创建一个简单的自编码器:
这是到目前为止的代码:
model=Sequential()encode=Dense(10, input_shape=[784])decode=Dense(784, input_shape=[10])model.add(encode)model.add(decode)model.compile(loss="mse", optimizer="adadelta", metrics=["accuracy"])decode_model=Sequential()decode_model.add(decode)
我正在训练它学习身份函数
model.fit(X_train,X_train,batch_size=50, nb_epoch=10, verbose=1, validation_data=[X_test, X_test])
重建结果相当有趣:
但我也想看看聚类的表示。将 [1,0…0] 传递给解码层会得到什么输出?这应该是 MNIST 中一个类别的“聚类均值”。
为了做到这一点,我创建了第二个模型 decode_model
,它重用了解码层。但如果我尝试使用该模型,它会报错:
Exception: Error when checking : expected dense_input_5 to have shape (None, 784) but got array with shape (10, 10)
这看起来很奇怪。这只是一个密集层,矩阵甚至无法处理 784 维的输入。我决定查看模型摘要:
____________________________________________________________________________________________________Layer (type) Output Shape Param # Connected to ====================================================================================================dense_14 (Dense) (None, 784) 8624 dense_13[0][0] ====================================================================================================Total params: 8624
它连接到了 dense_13。很难跟踪层的名称,但这看起来像是编码层。果然,整个模型的模型摘要如下:
____________________________________________________________________________________________________Layer (type) Output Shape Param # Connected to ====================================================================================================dense_13 (Dense) (None, 10) 7850 dense_input_6[0][0] ____________________________________________________________________________________________________dense_14 (Dense) (None, 784) 8624 dense_13[0][0] ====================================================================================================Total params: 16474____________________
显然,这些层是永久连接的。奇怪的是,我的 decode_model
中没有输入层。
如何在 Keras 中重用一个层?我查看了函数式 API,但在那儿,层也是融合在一起的。
回答:
哦,没关系。
我应该阅读整个函数式 API 的:https://keras.io/getting-started/functional-api-guide/#shared-layers
我猜这可能是数字 3?嗯,至少现在它工作了。
对于那些有类似问题的人,以下是更新后的代码:
inputs=Input((784,))encode=Dense(10, input_shape=[784])(inputs)decode=Dense(784, input_shape=[10])model=Model(input=inputs, output=decode(encode))model.compile(loss="mse", optimizer="adadelta", metrics=["accuracy"])inputs_2=Input((10,))decode_model=Model(input=inputs_2, output=decode(inputs_2))
我只编译了一个模型。对于训练,你需要编译模型,对于预测则不需要。