在 ResNet 网络顶部添加层时图形断开连接

Graph disconnected when layers added on top of ResNet network

我正在尝试更改 ResNet50 网络的输入形状。我需要 3 个以上通道的输入。当您指定输入形状而不加载 imagenet 权重时,ResNet 应用程序可以工作,但我想使用 imagenet 的权重以避免长时间的训练阶段。

我知道 imagenet 的权重适用于具有三个通道的输入形状,但理论上通过切断网络的头部并添加一个新的输入层这应该可行。

我试图删除头层,但我遇到了一些问题,说过滤器的数量与 3 不同

ValueError: number of input channels does not match corresponding dimension of filter, 6 != 3

    model=keras.applications.resnet50.ResNet50(include_top=False,
               input_shape(200,200,3),weights='imagenet')
    model.layers.pop(0)
    model.layers.pop(0)
    model.layers.pop()
    X_input = Input((200,200,6), name='input_1')
    X = ZeroPadding2D((3, 3), name='conv1_pad')(X_input)
    model = Model(inputs=X, outputs=model(X))
    model.summary()

我认为可以更改输入形状的通道数并仍然使用来自 imagenet 的权重,但我尝试的方法似乎是错误的。

我不确定 keras 模型是否支持在其层上进行列表操作,似乎弹出层不会使其忘记其预期的输入大小。

您可以使用您的输入形状初始化一个新的 resnet,并手动将 Imagenet 权重加载到除前 3 层之外的所有层,前 3 层预计其输入张量中有 3 个通道。

keras.applications.resnet50 中借用几行代码会得到如下结果:

import h5py
import keras
from keras_applications.resnet50 import WEIGHTS_PATH_NO_TOP

input_tensor = keras.Input((200, 200, 6))
resnet = keras.applications.ResNet50(
    input_tensor=input_tensor, weights=None, include_top=False
)

weights_path = keras.utils.get_file(
    'resnet50_weights_tf_dim_ordering_tf_kernels_notop.h5',
    WEIGHTS_PATH_NO_TOP,
    cache_subdir='models',
    md5_hash='a268eb855778b3df3c7506639542a6af')

with h5py.File(weights_path, 'r') as f:
    for layer in resnet.layers[3:]:
        if layer.name in f:
            layer.set_weights(f[layer.name].values())

话虽如此,您尝试进行的迁移学习并不是很常见,我真的很想知道它是否有效。如果它实际上收敛得更快,你能更新一下吗?