Я относительно новичок в DL и Keras.
Я пытаюсь реализовать потерю восприятия с помощью предварительно обученного VGG16 в Keras, но у меня есть некоторые проблемы. Я уже нашел этот вопрос, но все еще борюсь: /
Краткое объяснение того, что должна делать моя сеть:
У меня есть CNN (впоследствии называемый mainModel), который получает изображения в оттенках серого в качестве входных данных (#TrainData, 512, 512, 1) и выводит изображения в оттенках серого с тем же размером. Сеть должна уменьшить количество артефактов на изображениях - но я думаю, что для этого вопроса это не так важно. Вместо использования, например, MSE как функция потерь, я хотел бы реализовать потерю восприятия.
Что я хочу сделать (надеюсь, я правильно понял концепцию потери восприятия):
Я хотел бы добавить lossModel (предварительно обученный VGG16 с фиксированными параметрами) к моей mainModel. Затем я хотел бы передать вывод mainModel в lossModel. Кроме того, я передаю изображения меток (Y_train) в lossModel. Далее я сравниваю активации на определенном уровне (например, block1_conv2) модели потери, используя, например, MSE и используйте его как функцию потерь.
Что я сделал на данный момент:
Загрузите данные и создайте mainModel:
### Load data ###
with h5py.File('.\train_test_val.h5', 'r') as hf:
X_train = hf['X_train'][:]
Y_train = hf['Y_train'][:]
X_test = hf['X_test'][:]
Y_test = hf['Y_test'][:]
X_val = hf['X_val'][:]
Y_val = hf['Y_val'][:]
### Create Main Model ###
input_1 = Input((512,512,9))
conv0 = Conv2D(64, (3,3), strides=(1,1), activation=relu, use_bias=True, padding='same')(input_1)
.
.
.
mainModel = Model(inputs=input_1, outputs=output)
Создайте lossModel, добавьте его в mainModel и исправьте параметры:
### Create Loss Model (VGG16) ###
lossModel = vgg16.VGG16(include_top=False, weights='imagenet', input_tensor=mainModel.output, input_shape=(512,512, 1))
lossModel.trainable=False
for layer in lossModel.layers:
layer.trainable=False
Создайте новую модель, включая обе сети, и скомпилируйте ее.
### Create new Model ###
fullModel = Model(inputs=mainModel.input, outputs=lossModel.output)
fullModel.compile(loss='mse', optimizer='adam',metrics=['mse','mae'])
fullModel.summary()
Отрегулируйте изображения этикеток, передав их через lossNetwork:
Y_train_lossModel = lossModel.predict(Y_train)
Установите полную модель, используя потерю восприятия:
fullModel.fit(X_train, Y_train_lossModel, batch_size=32, epochs=5, validation_data=[X_val,Y_val])
Возникающие проблемы:
VGG16 хочет получить входные данные формы (?,?, 3), но моя mainModel выводит изображение в оттенках серого (?,?, 1)
Некоторая проблема с добавлением lossModel к mainModel
RuntimeError: График отключен: невозможно получить значение для тензорного тензора ("conv2d_2 / Relu: 0", shape = (?, 512, 512, 3), dtype = float32) на уровне "input_2". Доступ к следующим предыдущим слоям был осуществлен без проблем: []
- Как я могу рассчитать MSE при активации определенных слоев, а не на выходе lossModel?
Большое спасибо за вашу помощь и извините за очень длинный вопрос :)