Я построил и обучил сеть на основе сети 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? Или есть другой способ получить тот же результат?