Керас как поменять обучаемые слои загруженной модели - PullRequest
0 голосов
/ 05 января 2019

Я построил и обучил сеть на основе сети vgg16. В исходной сети я заморозил все слои vgg16 и обучил только последние 4 слоя, которые я добавил в конце vgg16. Теперь я хочу загрузить и переобучить эту модель, изменив обучаемые слои, чтобы использовать собственные веса вместо весов ImageNet. Сначала я попытался построить ту же модель, изменив обучаемые слои vgg16 и веса моделей, используя следующий код.

# Load the VGG model
vgg_conv = VGG16(weights='imagenet', include_top=False, input_shape=(image_size, image_size, 3))

# Freeze n number of layers from the last
for layer in vgg_conv.layers[:-8]: layer.trainable = False 

# Check the trainable status of the individual layers
for layer in vgg_conv.layers: print(layer, layer.trainable)          

# Create and compile the model
model = createModel()
trained_model = keras.models.load_model(trained_dir)
model.set_weights(trained_model.get_weights())
model.compile(loss='categorical_crossentropy', optimizer=optimizers.RMSprop(lr=lr), metrics=['acc'])

Но это дает мне эту ошибку:

ValueError: Невозможно передать значение формы (3, 3, 3, 64) для Tensor 'Placeholder_869: 0', который имеет форму '(3, 3, 256, 512)'

Когда я проверяю веса исходных и новых сетей, я вижу, что формы некоторых весов разные. Я также пытался изменить обучаемые слои исходной сети, но for layer in trained_model.layers: print(layer, layer.trainable) показывает только последние добавленные слои. Так как же изменить обучаемые слои моего собственного training_model? Или есть другой способ получить тот же результат?

1 Ответ

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

Это может быть возможным решением. Я создал модель на основе vgg16 с приведенным выше кодом. Затем я изменил веса последних слоев, запустив этот код: model.layers[1].set_weights(trained_model.layers[1].get_weights()). Поскольку я добавил 4 слоя в vgg16, я выполнил этот код, изменив индекс слоя с 1 на 4. Я еще не пробовал модель. Если это не правильное решение, я был бы рад прочитать ваши ответы.

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