【发布时间】:2023-04-03 07:59:02
【问题描述】:
我对 DL 和 Keras 比较陌生。
我正在尝试使用 Keras 中预训练的 VGG16 来实现感知损失,但遇到了一些麻烦。我已经找到了question,但我还在苦苦挣扎:/
我的网络应该做什么的简短说明:
我有一个 CNN(后来称为 mainModel),它获取灰度图像作为输入(#TrainData, 512, 512, 1)并输出相同大小的灰度图像。网络应该减少图像中的伪影——但我认为这对这个问题并不重要。而不是使用例如MSE作为损失函数,我想实现感知损失。
我想做的事(希望我已经正确理解了知觉损失的概念):
我想在我的 mainModel 中附加一个 lossModel(预训练的 VGG16 和固定参数)。然后我想将mainModel的输出传递给lossModel。此外,我将标签图像 (Y_train) 传递给 lossModel。进一步,我使用例如比较 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:
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: cannot get value for tensor Tensor("conv2d_2/Relu:0", shape=(?, 512, 512, 3), dtype=float32) at layer "input_2".访问以下先前层没有问题:[]
- 如何计算特定层激活而不是 lossModel 输出的 MSE?
非常感谢您的帮助,很抱歉这个非常长的问题:)
【问题讨论】:
标签: tensorflow keras deep-learning vgg-net