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

Python Keras:在不同模型中使用同一层(共享权重),python,machine-learning,tensorflow,keras,Python,Machine Learning,Tensorflow,Keras,快速回答: 这其实很容易。 以下是代码(适用于那些不想阅读所有文本的人): 在此设置中,decode\u模型将使用与模型相同的解码层。 如果您训练模型,也将训练解码模型 实际问题: 我正在尝试为Keras中的MNIST创建一个简单的自动编码器: 这是迄今为止的代码: model=Sequential() encode=Dense(10, input_shape=[784]) decode=Dense(784, input_shape=[10]) model.add(encode) model.

快速回答:

这其实很容易。 以下是代码(适用于那些不想阅读所有文本的人):

在此设置中,
decode\u模型
将使用与
模型
相同的解码层。 如果您训练
模型
,也将训练
解码模型

实际问题:

我正在尝试为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\u model
,它重用了解码器层。 但如果我尝试使用该模型,它会抱怨:

异常:检查时出错:预期密集_输入_5具有形状(无,784),但获得具有形状(10,10)的数组

这似乎很奇怪。这只是一个密集层,矩阵甚至无法处理784微光输入。 我决定看一下模型摘要:

____________________________________________________________________________________________________
Layer (type)                     Output Shape          Param #     Connected to                     
====================================================================================================
dense_14 (Dense)                 (None, 784)           8624        dense_13[0][0]                   
====================================================================================================
Total params: 8624
它连接到稠密的_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\u模型中没有输入层

如何在Keras中重用层? 我已经看过函数式API,但也有一些层融合在一起。

哦,没关系

我应该阅读完整的函数API:

以下是其中一个预测(可能仍然缺乏培训):

我猜这可能是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))
我只编译了其中一个模型。
对于培训,您需要编译一个模型,以便进行不必要的预测。

共享层可以通过列表
model1从一个模型直接访问到第二个模型。层
。需要技巧的是访问输入层
tf.keras.input
(不确定
tf.keras.layers.InputLayer
,也不建议使用它),正如我最近看到的,这些并不简单。但是您可以通过
model1访问输入。输入
的顺序与定义model1的
Input
层的顺序相同。你可以建立一个新的模型

in1, in2 = keras.Input(shape=shape1), keras.Input(shape=shape2)
x = Some_Layer(in1)
y1 = Some_Layer(in2)
y2 = Some_model([x, in1, in2])
model1 = Model(inputs=[in1, in2], outputs=[y1, y2])

y3 = Some_model([x, y1])
model2 = Model(inputs=[model1.inputs[0], y1], outputs=[x, y3])

你看过这个教程了吗?没有,但是看起来很有趣。谢谢
in1, in2 = keras.Input(shape=shape1), keras.Input(shape=shape2)
x = Some_Layer(in1)
y1 = Some_Layer(in2)
y2 = Some_model([x, in1, in2])
model1 = Model(inputs=[in1, in2], outputs=[y1, y2])

y3 = Some_model([x, y1])
model2 = Model(inputs=[model1.inputs[0], y1], outputs=[x, y3])