如何使用 Tensorflow Keras api 从预训练模型复制特定层权重?

How do I copy specific layer weights from pretrained models using Tensorflow Keras api?

我正在尝试训练一个采用 4 通道输入的转换网络,并想使用像 VGG16 这样的预训练模型。我不应该使用来自 VGG16 的初始 conv 块是有道理的,因为它们接受了 3 通道输入的训练,并重新定义了初始 conv 块。

但是,我想从 VGG16 开始使用 block3。我如何使用 Tensorflow Keras 实现此目的 api?

简而言之,我如何从预训练模型的特定层复制权重。我正在使用 tensorflow 2.0 alpha 版本。

一个快速的方法是创建一个新模型,将您的自定义输入和 VGG16 的最后一层结合起来。找到您要保留的第一个 VGG16 层的索引,并将其连接到您新创建的输入。然后手动连接以下每个 VGG16 层以重新创建 VGG16 段。您可以沿途冻结 VGG16 层。

from tensorflow.keras.applications.vgg16 import VGG16
from tensorflow.keras.preprocessing import image
from tensorflow.keras.applications.vgg16 import preprocess_input
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Input, Conv2D

vgg16 = VGG16()

# Find the index of the first block3 layer
for index in range(len(vgg16.layers)):
    if 'block3' in vgg16.layers[index].name:
        break

# Add your own input
model_input = Input(shape=(224,224,4), name='new_input')
x = Conv2D(...)(model_input)
...

# Connect your last layer to the VGG16 model, starting at the "block3" layer
# Then, you need to connect every layer manually in a for-loop, freezing each layer along the way

for i in range(index, len(vgg16.layers)):
  # freeze the VGG16 layer
  vgg16.layers[i].trainable = False  

  # connect the layer
  x = vgg16.layers[i](x)

model_output = x
newModel = Model(model_input, model_output)

还要确保自定义层的输出与 block3 层期望作为输入的形状相匹配。