В случае двух моделей keras, совместно использующих слои, какую модель компилировать после установки trainable = False? - PullRequest
1 голос
/ 19 июня 2019

У меня есть 2 модели керас, которые мне нужно тренировать. Допустим, первая модель имеет 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')

Теперь по какой-то причине мне нужно тренировать модель 1 партиями, т. Е. Я не могу вызвать метод fit () и выполнить обучение за 1 проход.

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

Теперь подходит к проблеме. Мне нужно переключать тренировочный параметр model2 внутри каждой эпохи несколько раз. Думайте о GAN как сценарий. Так что мне нужно сделать это внутри цикла

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

Однако Керас говорит, что после переключения обучаемого параметра модели вам нужно перекомпилировать модель, чтобы изменения вступили в силу. Но я не могу понять, какую модель для компиляции? Слои распределяются между моделью 1 и моделью 2. Должна ли компиляция любого из них быть в порядке? Или мне нужно скомпилировать их оба.

Итак, я имею в виду, что следующее эквивалентно или нет?

Дело 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')
...