Как сбросить вес конкретного слоя для обучения переносу? - PullRequest
0 голосов
/ 20 сентября 2018

Я ищу способ переинициализировать веса слоев в существующей предварительно обученной модели keras.

Я использую python с keras и мне нужно использовать трансферное обучение, я использую следующий код для загрузки предварительнообученные модели keras

from keras.applications import vgg16, inception_v3, resnet50, mobilenet
vgg_model = vgg16.VGG16(weights='imagenet')

Я читал, что при использовании набора данных, который сильно отличается от исходного набора данных, может быть полезно создать новые слои поверх объектов более низкого уровня, которые есть в обученной сети.

Я нашел, как разрешить точную настройку параметров, и теперь я ищу способ сбросить выбранный слой для его повторной подготовки.Я знаю, что могу создать новую модель и использовать слой n-1 в качестве входных данных и добавить к нему слой n, но я ищу способ сброса параметров в существующем слое в существующей модели.

1 Ответ

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

По какой-либо причине вам может понадобиться повторно инициализировать веса одного слоя k, вот общий способ сделать это:

from keras.applications import vgg16
from keras import backend as K

vgg_model = vgg16.VGG16(weights='imagenet')
sess = K.get_session()

initial_weights = vgg_model.get_weights()

from keras.initializers import glorot_uniform  # Or your initializer of choice

k = 30 # say for layer 30
new_weights = [glorot_uniform()(initial_weights[i].shape).eval(session=sess) if i==k else initial_weights[i] for i in range(len(initial_weights))]

vgg_model.set_weights(new_weights)

Вы можете легко проверить, что initial_weights[k]==new_weights[k] возвращаетмассив False, в то время как initial_weights[i]==new_weights[i] для любого другого i возвращает массив True.

...