我有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')
答案 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)