2017-04-11 140 views
2

例如我有3中间层的模型:如何将模型分为两个独立模型?

Model1 : Input1 --> L1 --> L2 --> L3

并希望将其分割成

Model2 : Input2 --> L1 --> L2

Model3 : Input3 --> L3

很容易将这两个堆叠起来以获得使用功能API的第一个API。但我不知道如何做相反的事情。

第一个拆分模型可以通过:Model(Input1, L2.output)获得,但第二个并不那么容易。什么是最简单的方法来做到这一点?

示例代码:

# the first model 
input1 = Input(shape=(784,)) 
l1 = Dense(64, activation='relu')(inputs) 
l2 = Dense(64, activation='relu')(l1) 
l3 = Dense(10, activation='softmax')(l2) 
model1 = Model(inputs, l3) 

我想建立描述model2model3该共享权重以上model1而MODEL1已经存在(也许从磁盘加载)。

谢谢!

+0

澄清模型(Input3,L3)不工作?为什么? – putonspectacles

+0

你能写一些代码作为你想要实现的例子吗? – putonspectacles

+0

@putonspectacles感谢您的回复。模型(Input3,L3)是不可能的,因为Input3不存在,L3的输入是L2的输出。我认为这里的关键是如何正确地重置L3的输入。我更新了一些示例代码。 –

回答

2

总之,需要额外Input。因为输入张量不同于中间张量

首先定义共享层: l1 = Dense(64, activation='relu') l2 = Dense(64, activation='relu') l3 = Dense(10, activation='softmax')

记住 input1 = Input(shape=(784,)) # input1 is a input tensor o1 = l1(input1) # o1 is an intermediate tensor

Model1可以被定义为model1 = Model(input1, l3(l2(l1(input1))))

要定义model2,必须首先定义一个新的输入张量input2=Input(shape=(64,))。然后model2 = Model(input2, l3(l2(input2))

+0

非常感谢。这对我有用。但是还有一个问题,可能会更简单吗?由于此方法需要重建model2中已包含的model2的整个计算图。当model1是一个加载的预训练模型并且非常复杂时,提取所有中间层和重建模型2可能很困难。理想的情况是在model1中指定两个点,并以某种方式将“中间”部分“提取”为子模型。 keras有可能吗? –

+0

据我所知,你不能那样做。由于keras依赖于TF或Theano,而这些框架以不同的中间张量处理输入张量。 – Van

相关问题