Сделайте глубокую копию модели keras в python - PullRequest
0 голосов
/ 25 января 2019

Я хотел бы сделать глубокую копию моей модели keras (называемой model1), чтобы иметь возможность использовать ее в цикле for, а затем повторно инициализировать для каждой итерации цикла for и выполнять fit с одним дополнительным образцом к модели. Я хотел бы иметь возможность инициализировать модель после каждой итерации, поскольку после выполнения fit (однако моя модель изменена, я хочу, чтобы она оставалась такой же, как и при загрузке с пути с использованием load_weights).

Мой код выглядит так:

model1= create_Model()
model1.compile(optimizer='rmsprop', loss='categorical_crossentropy')
model1.load_weights('my_weights')

model_copy= create_Model()
model_copy.compile(optimizer='rmsprop', loss='categorical_crossentropy')

model_copy= keras.models.clone_model(model1)
for j in range(0, image_size):
      model_copy.fit(sample[j], sample_lbl[j])
      prediction= model_copy.predict(sample[j])

Кроме того, для меня неэффективно загружать модель каждый раз в цикле for, поскольку это отнимает много времени. Как я могу правильно сделать глубокую копию в моем случае? Код, который я отправил дать следующее сообщение об ошибке, что касается функции .Поставить и мою эталонную модель model_copy:

RuntimeError: Вы должны скомпилировать модель перед тренировкой / тестированием. Используйте model.compile(optimizer, loss).

1 Ответ

0 голосов
/ 25 января 2019

Проблема в том, что model_copy, вероятно, не компилируется после клонирования. На самом деле есть несколько проблем:

  1. Очевидно, что клонирование не копирует функцию потерь, информацию оптимизатора и т. Д.

  2. Перед компиляцией необходимо также построить модель.

  3. Более того, клонирование не копирует вес, превышающий

Так что вам нужно пару дополнительных строк после клонирования. Например, для 10 входных переменных:

model_copy= keras.models.clone_model(model1)
model_copy.build((None, 10)) # replace 10 with number of variables in input layer
model_copy.compile(optimizer='rmsprop', loss='categorical_crossentropy')
model_copy.set_weights(model.get_weights())


Более простой способ 1: загрузка весов из файла

Если я правильно понимаю ваш вопрос, есть более простой способ сделать это. Вам не нужно клонировать модель, просто нужно сохранить old_weights и установить веса в начале цикла. Вы можете просто загрузить веса из файла, как вы делаете.

for _ in range(10):
    model1= create_Model()
    model1.compile(optimizer='rmsprop', loss='categorical_crossentropy')
    model1.load_weights('my_weights')

    for j in range(0, image_size):
          model1.fit(sample[j], sample_lbl[j])
          prediction= model1.predict(sample[j])

Более простой способ 2: загрузка весов из предыдущего get_weights ()

Или, если вы предпочитаете не загружать из файла:

model1= create_Model()
model1.compile(optimizer='rmsprop', loss='categorical_crossentropy')
model1.load_weights('my_weights')
old_weights = model1.get_weights()

for _ in range(10):
    model1.set_weights(old_weights)
    for j in range(0, image_size):
          model1.fit(sample[j], sample_lbl[j])
          prediction= model1.predict(sample[j])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...