Keras: 在不同模型中使用同一层(共享权重)

快速回答:

这实际上非常简单。以下是代码(供那些不想阅读所有文本的人使用):

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 相同的解码层。如果你训练 modeldecode_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])

重建结果相当有趣:

enter image description here

但我也想看看聚类的表示。将 [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

这是一个预测(可能仍然需要一些训练):enter image description here

我猜这可能是数字 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))

我只编译了一个模型。对于训练,你需要编译模型,对于预测则不需要。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注