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

时间:2019-02-07 12:24:38

标签: keras neural-network resnet

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

我知道imagenet的权重适用于具有三个通道的输入形状,但是从理论上讲,它是通过剪裁网络的头部并添加新的输入层来实现的。

我尝试去掉了头层,但是我说过滤器的数量不同于3时遇到了一些问题

  

ValueError:输入通道数与相应的不匹配   过滤器尺寸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的权重,但是我尝试的方法似乎是错误的。

1 个答案:

答案 0 :(得分:1)

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

您可以使用输入形状初始化一个新的resnet,然后将Imagenet权重手动加载到所有图层,除了前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())

话虽如此,您尝试做的那种转移学习不是很常见,如果可行,我真的很好奇。如果收敛速度更快,您可以更新吗?