Можем ли мы изменить обученную структуру нейронной сети (файл .json или .h5) и ее вес (файл .h5) в кератах? - PullRequest
0 голосов
/ 13 марта 2019

После обучения нейронной сети и сохранения ее в определенном формате (скажем, в формате .h5 или .json).Предположим, я хочу сделать вывод, используя сеть, но без слоя (скажем, нормализацию пакетов), могу ли я удалить только этот слой из файла модели (.h5 или json) и сделать вывод?

Можно ли изменить сеть и сделать вывод?Если да, то как?

Ответы [ 2 ]

2 голосов
/ 13 марта 2019

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

input = Input(..., name='image_in')
conv1 = Conv2D(..., name='conv2d')(input)
normed = BatchNormalization(...)(conv1)
out = Flatten()(normed)
out = Dense(num_classes, activation='softmax', name='final_dense')(out)
model = Model(input, out)
# ... train etc
model.save_weights(model_file)

Затем вы можете создать другую модель и просто использовать то же имя для слоев, которыми вы хотите поделиться:

input = Input(..., name='image_in')
conv1 = Conv2D(..., name='conv2d')(input) # reuse conv2d
out = Flatten()(conv1) # we got rid of batch
out = Dense(num_classes, activation='softmax', name='final_dense')(out) # reuse final_dense
new_model = Model(input, out)
# ... now load
new_model.load_weights(model_file, by_name=True)

Настройка by_name=True только загрузкаслои с соответствующим именем в любой архитектуре, которую вы хотите.

0 голосов
/ 13 марта 2019

Один метод, который дает много свободы для различных видов редактирования моделей, но, к сожалению, довольно громоздкий:

  1. Получите конфигурацию и вес вашей модели keras, позвонив по номеру

    temp_config = my_model.get_config ()

    temp_weights = my_model.get_weights ()

  2. проанализируйте, какой слой в temp_config вы хотите изменить или удалить.

  3. внести изменения в temp_config и соответствующие изменения в temp_weights. К сожалению, может быть довольно сложно найти правильные веса для каждого слоя, так как веса просто добавляются друг к другу (часто заканчивая потоком весов, уклонов, весов, уклонов, весов, уклонов и т. Д.). В вашем случае вы удаляете слой и удаляете соответствующие веса этому слою.

  4. , затем создайте модель, используя новый конфиг и веса

    new_model = Model.from_config (new_config)

    new_model.set_weights (new_weights)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...