在2个keras模型共享图层的情况下,设置trainable = False后要编译哪个模型?

时间:2019-06-19 14:36:23

标签: python tensorflow machine-learning keras backpropagation

我有2个需要训练的keras模型。可以说第一个模型有5层。现在,我将第一个模型的最后3层称为另一个模型。

赞:

input=Input(shape=(100,))
x1=Dense(50, activation='relu')(input)
x2=Dense(50, activation='relu')(x1)
x3=Dense(50, activation='relu')(x2)
x4=Dense(50, activation='relu')(x3)
output=Dense(10, activation='softmax')(x4)

model1=Model(inputs=input, outputs=output)
model2=Model(inputs=x3, outputs=output)

model1.compile(optimizer='rmsprop', loss='cross_entropy')
model2.compile(optimizer='rmsprop', loss='cross_entropy')

现在由于某种原因,我需要分批训练model1,即我无法调用fit()方法,只能进行一次训练。

for epoch in range(10):
      model1.train_on_batch(x, y).

现在要解决这个问题。我需要在每个时期内多次切换model2的训练参数。像场景一样思考GAN。所以我需要在循环内完成

model2.trainable=False   // sometimes
model2.trainable=True    // other times

但是keras说,切换模型的可训练参数后,您需要重新编译模型以使更改生效。但是我不知道要编译哪个模型?这些图层在model1和model2之间共享。编译其中任何一个应该好吗?或者我需要同时编译它们。

所以我的意思是说以下内容是否相等?

情况1:

model2.trainable=False
model1.compile(optimizer='rmsprop', loss='cross_entropy')

情况2:

model2.trainable=False
model2.compile(optimizer='rmsprop', loss='cross_entropy')

情况3:

model2.trainable=False
model1.compile(optimizer='rmsprop', loss='cross_entropy')
model2.compile(optimizer='rmsprop', loss='cross_entropy')

1 个答案:

答案 0 :(得分:0)

在训练之前,您需要分别编译两个模型(否则您将一无所获):一个冻结了图层,另一个不带任何图层。如果仅将输入适合输出,则没有理由使用冻结的层来编译零件。

此外,如果您尝试定义一个以中间层作为输入的模型,keras也会抱怨,您将需要创建两个模型,然后将它们一个接一个地放入管道中。

input=Input(shape=(100,))
x1=Dense(50, activation='relu')(input)
x2=Dense(50, activation='relu')(x1)
x3=Dense(50, activation='relu')(x2)
aux_model1 = Model(inputs=input, outputs=x3)

x3_input= Input(shape=x3.shape.as_list()[1:])
x4=Dense(50, activation='relu')(input2 )
output=Dense(10, activation='softmax')(x4)
aux_model2 = Model(inputs=x3_input, outputs=output)

x3 = aux_model1(input)
output = aux_model2(x3)
model1 = Model(inputs=input, outputs=output)        

现在编译以使用所有可训练的训练:

model1.compile(optimizer='rmsprop', loss='cross_entropy')

现在编译以使用不可训练的aux_model2训练w /层:

for layer in aux_model2.layers:
    layer.trainable=False
model2 = Model(inputs=input, outputs=output)

model2.compile(optimizer='rmsprop', loss='cross_entropy')

然后根据条件训练model1或model2:

for epoch in range(10):
    if training_layers:
        model1.train_on_batch(x, y)
    else:
        model2.train_on_batch(x, y)