Тренируйте вторую модель, используя веса в тех же первых слоях первой модели. - PullRequest
0 голосов
/ 22 сентября 2018

Предположим, у нас есть две модели, модель1 и модель2.Предположим, что первые 10 слоев одинаковы для model1 и model2.Затем вы тренируете модель 1 в Керасе с некоторым набором данных.Вы сохраняете модель в "model1.h5".Затем вы понимаете, что веса model1 полезны для запуска вашей тренировочной модели2.Я хотел бы сделать что-то вроде этого:

# make model1  and model2
# then set weights for the first 10 layers
model1.load_model("model1.h5")
model2.set_weights[:10] = model1.get_weights[:10]
model2.compile(...)
model2.fit(...)
model2.save("model2.h5")

Ответы [ 2 ]

0 голосов
/ 23 сентября 2018

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

# load the model
model = load_model(...)

model.layers[index_of_layer].name = 'layer_name'

Затем вы можете использовать решение @ nuric для загрузки весов.Далее, чтобы найти индекс слоев, вы можете использовать model.summary().Слои нумеруются сверху вниз в этом списке, начиная с нуля.

0 голосов
/ 22 сентября 2018

Чистый способ сделать это, используя опцию model.load_weights(file, by_name=True).Вам нужно назначить одинаковые имена для общих слоев:

# model 1 ...
model1.add(Dense(64, name="dense1"))
model1.add(Dense(2, name="dense2"))

# model 2 ...
model2.add(Dense(64, name="dense1"))
model2.add(Dense(32, name="notshared"))

# train model 1 and save
model1.save(filename) # or model.save_weights(filename)

# Load shared layers into model 2
model2.load_weights(filename, by_name=True) # will skip non-matching layers
# So it will only load "dense1"

Суть в том, что вы загружаете веса модели 2 из файла весов модели 1, но только совпадающие имена слоев.Слои должны быть одинаковой формы и типа.

...