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

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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