Как совместить две модели попеременно в керасе - PullRequest
0 голосов
/ 04 июня 2019

Отличается от link1 и link2 , теперь у меня две сети с разными функциями потерь соответственно, и я хочу поочередно объединить эти две модели в один пакет.

Если говорить конкретно, если есть одна модель, А. Я обучаю ее следующему псевдокоду:

model = some_value # initial
for e in 1:epoch
    for b in 1:batch
        model = train(A, model)

Вышеописанная процедура может быть реализована только одной строкой кода в кератах:

model.fit(X_train, Y_train,
          batch_size=32, epoch=10)

Теперь у меня есть две модели, A и B. Я обучаю их по следующему псевдокоду:

model_A = some_value # initial
model_B = some_value # initial
for e in 1:epoch
    for b in 1:batch
        model_A = train(A, model_B) # I using the model_B in the loss function of neural network model_A
        model_B = train(A, model_A) # I using the model_A in the loss function of neural network model_B

Как реализовать эту процедуру в керасе?

1 Ответ

0 голосов
/ 04 июня 2019
batchlen = int(len(X_train)/batches)
for e in range(0,epochs):
    for b in range(0,batches):
        model_A.fit(
          X_train[b*batchlen:(b+1)*batchlen], 
          Y_train[b*batchlen:(b+1)*batchlen], 
          initial_epoch=e, 
          epochs=e+1)
        model_B.fit(X_train[b*batchlen:(b+1)*batchlen], Y_train[b*batchlen:(b+1)*batchlen], initial_epoch=e, epochs=e+1)

Лучше использовать fit_generator вместе с генератором для подачи X_train, Y_train.Результат должен быть примерно таким:

for e in range(0,epochs):
    model_A.fit_generator(
      your_generator(X_train, Y_train), 
      initial_epoch=e, 
      epochs=e+1, 
      steps_per_epoch=len(X_train)/(batch_size))
    model_B.fit_generator(your_generator(X_train, Y_train), initial_epoch=e, epochs=e+1, steps_per_epoch=len(X_train)/(batch_size))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...