gpt4 book ai didi

python - 如果 2 个 keras 模型共享层,设置 trainable=False 后要编译哪个模型?

转载 作者:太空宇宙 更新时间:2023-11-04 01:56:39 26 4
gpt4 key购买 nike

我有 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() 方法并在 1 次通过中进行训练。

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 之间共享。编译其中任何一个都可以吗?或者我需要编译它们。

所以我的意思是说以下是否等价?

案例一:

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

案例二:

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

案例三:

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

最佳答案

你需要在训练前分别编译这两个模型(否则你将白白填满你的内存):一个层卡住,另一个没有。如果您只是将输入拟合到输出,则没有理由编译具有卡住层的部分。

此外,如果您尝试定义一个带有中间层的模型作为输入,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')(x3_input)
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 中不可训练的层:

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)

关于python - 如果 2 个 keras 模型共享层,设置 trainable=False 后要编译哪个模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56670255/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com