Я работаю над проектом схожести изображений. Существует два типа изображений (то есть: изображения с камеры и другой соответствующий эскиз или модель САПР).
Сеть будет обучена обнаружению сходства / различия между данными изображениями.
Для этой задачи конвейер работает следующим образом:
VGGNet-16 (без классификационной головки) будет использоваться в качестве экстрактора признаков. Я использовал два VGGNets (для каждого типа изображения).
vgg16_model = keras.applications.vgg16.VGG16()
vggcam_model = Sequential()
vggcad_model = Sequential()
for layer in vgg16_model.layers[:-4]:
vggcam_model.add(layer)
vggcad_model.add(layer)
Затем я заморозил все слои:
for vggcam_layers, vggcad_layers in zip(vggcam_model.layers, vggcad_model.layers):
vggcam_layers.trainable, vggcad_layers = (False, False)
Извлеченные векторы объектов:
encoded_camfv = Flatten()(vggcam_model(cam_input))
encoded_cadfv = Flatten()(vggcad_model(cad_input))
Это создаст вектор с фиксированным размером для каждого типа изображения.
Далее оба вектора признаков будут объединены и помещены в сеть сходства:
merge = concatenate([encoded_camfv, encoded_cadfv])
fc1 = Dense(1024, activation='relu', name='fc1')(merge)
fc2 = Dense(1024, activation='relu', name='fc2')(fc1)
output = Dense(1, activation='softmax', name='fc3')(fc2)
model = Model(inputs=[cam_input, cad_input], outputs=output)
print(model.summary())
Краткое описание модели:
Layer (type) Output Shape Param # Connected to
==================================================================================================
input_1 (InputLayer) (None, 224, 224, 3) 0
__________________________________________________________________________________________________
input_2 (InputLayer) (None, 224, 224, 3) 0
__________________________________________________________________________________________________
sequential_1 (Sequential) (None, 7, 7, 512) 14714688 input_1[0][0]
__________________________________________________________________________________________________
sequential_2 (Sequential) (None, 7, 7, 512) 14714688 input_2[0][0]
__________________________________________________________________________________________________
flatten_1 (Flatten) (None, 25088) 0 sequential_1[1][0]
__________________________________________________________________________________________________
flatten_2 (Flatten) (None, 25088) 0 sequential_2[1][0]
__________________________________________________________________________________________________
concatenate_1 (Concatenate) (None, 50176) 0 flatten_1[0][0]
flatten_2[0][0]
__________________________________________________________________________________________________
fc1 (Dense) (None, 1024) 51381248 concatenate_1[0][0]
__________________________________________________________________________________________________
fc2 (Dense) (None, 1024) 1049600 fc1[0][0]
__________________________________________________________________________________________________
fc3 (Dense) (None, 1) 1025 fc2[0][0]
==================================================================================================
Total params: 67,146,561
Trainable params: 52,431,873
Non-trainable params: 14,714,688
__________________________________________________________________________________________________
None
Поскольку я использовал дваVGG моделирует один для каждого типа изображения. Почему количество необученных параметров составляет всего 14,714,688 . Это должно быть 2 x Не обучаемые параметры .
На более поздних этапах я разморозил последний сверточный блок сети и обучил сеть подобия вместе с последним блоком CONVO.
for vggcam_layers, vggcad_layers in zip(vggcam_model.layers[15:], vggcad_model.layers[15:]):
vggcam_layers.trainable, vggcad_layers = (True, True)
Это также показывает то же поведение. Это проблема с кодом или в моем понимании?
Заранее спасибо.