python - Keras:在不同的模型中使用相同的层(共享权重)

标签 python machine-learning tensorflow 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)

这看起来很奇怪。它只是一个密集层,Matrix 甚至无法处理 784 维输入。 我决定查看模型摘要:

____________________________________________________________________________________________________
Layer (type)                     Output Shape          Param #     Connected to                     
====================================================================================================
dense_14 (Dense)                 (None, 784)           8624        dense_13[0][0]                   
====================================================================================================
Total params: 8624

它连接到 dense_13。 很难跟踪层的名称,但它看起来像编码器层。果然,整个模型的model summary是:

____________________________________________________________________________________________________
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))

我只编译了其中一个模型。 对于训练,您需要编译一个模型,对于不需要的预测。

关于python - Keras:在不同的模型中使用相同的层(共享权重),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40278868/

相关文章:

python - 如何从 model.predict() 结果中获取单个值

python - 在 scikit-learn 中组合特征提取类

python - 如何在父字符串列表中查找子字符串列表对应的索引

python - 我想从一个巨大的数字中随机选择一个数字

python - scikit 学习中断 pandas 安装

machine-learning - 非线性函数的神经网络

android - 在 Android 应用程序上使用 Tensorflow Estimator 导出模型

c++ - 检查失败 : 1 == NumElements() (1 vs. 1792)在 Tensorflow C++ 中必须有一个元素张量

tensorflow - 如何使用 TensorFlow JS 为 csv 数据集创建模型并计算预测结果

python - 比较两个向量