我对 DL 和 Keras 比较陌生。
我正在尝试使用 Keras 中预训练的 VGG16 来实现感知损失,但遇到了一些麻烦。我已经找到了这个问题,但我仍在苦苦挣扎:/
简要说明我的网络应该做什么:
我有一个 CNN(随后称为 mainModel),它获取灰度图像作为输入(#TrainData, 512, 512, 1)并输出相同大小的灰度图像。网络应该减少图像中的伪影——但我认为这对这个问题并不重要。我想实现感知损失,而不是使用例如 MSE 作为损失函数。
我想做什么(我希望我已经正确理解了感知损失的概念):
我想在我的 mainModel 中附加一个 lossModel(带有固定参数的预训练 VGG16)。然后我想将mainModel的输出传递给lossModel。此外,我将标签图像 (Y_train) 传递给 lossModel。进一步,我使用例如 MSE 比较 lossModel 的特定层(例如 block1_conv2)的激活并将其用作损失函数。
到目前为止我做了什么:
加载数据并创建 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:
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: Graph disconnected: 无法在“input_2”层获取张量 Tensor("conv2d_2/Relu:0", shape=(?, 512, 512, 3), dtype=float32) 的值。访问以下先前层没有问题:[]
- 如何计算特定层激活而不是 lossModel 输出的 MSE?
非常感谢您的帮助,并对这个非常长的问题感到抱歉:)