【问题标题】:How to Implement CaffeNet on Keras with pretrained weight from Caffe如何使用来自 Caffe 的预训练权重在 Keras 上实现 CaffeNet
【发布时间】:2019-01-16 17:42:19
【问题描述】:

我想在 keras 上实现 caffeNet,并在 imagenet 上进行预训练。所以我从 caffe github 那里得到了重量 https://github.com/BVLC/caffe/tree/master/models/bvlc_reference_caffenet

我使用 caffe_weight_converter 将其转换为 weight.h5。我在“conv2”层获得的重量具有形状 (256,48,5,5),但我的实现模型需要 (256,96,5,5)。

我从Got confused after I extracted weights from Trained caffenet 看到那是因为在“conv2”层中分成了 2 个组。我想问一下keras可以将conv层分成组吗?或者有什么解决方案可以让我在 keras 上获得预训练的 caffeNet?

【问题讨论】:

    标签: keras deep-learning caffe


    【解决方案1】:

    我尝试过实现CaffeNet的下半部分(LRN层省略):

    A = Input((277,277,3))
    B = Convolution2D(filters=96, kernel_size=(11,11), strides=(4,4), activation='relu')(A)
    C = MaxPooling2D(pool_size=(3,3), strides=(2,2))(B)
    D1 = Lambda(lambda x: x[:,:,:,:48])(C)
    D2 = Lambda(lambda x: x[:,:,:,48:])(C)
    E = Concatenate()([D1,D2])
    F = Convolution2D(filters=256, kernel_size=(5,5), padding="same")(E)
    model = Model(A,F)
    

    参考:Caffe Convolution "Group" parameter conversion to Keras Conv2D

    Splitting the output of a layer over the channels

    【讨论】:

    • 你是否使用了来自 imagenet 的预训练权重?
    • @NitiwatSompawong 不。我还没有实现完整的 caffenet 模型。
    • @NitiwatSompawong 你能分享你的实现吗?
    【解决方案2】:

    @keineahnung2345 我无法在评论中发布代码,因为太长了,所以我发布了新答案。

    model_input= Input((227,227,3))
    #conv1
    x=Conv2D(filters=96, kernel_size=(11,11), strides=(4,4), name="conv1",activation="relu")(model_input)
    x=MaxPooling2D(pool_size=(3,3), strides=(2,2), name="pool1")(x)
    x=BatchNormalization()(x)
    
    #conv2
    x=ZeroPadding2D((2, 2))(x)
    con2_split1 = Lambda(lambda z: z[:,:,:,:48])(x)
    con2_split2 = Lambda(lambda z: z[:,:,:,48:])(x)
    a=x=Concatenate(axis=0)([con2_split1, con2_split2])
    x=Conv2D(filters=256, kernel_size=(5,5), strides=(1,1), name="conv2",activation="relu")(x)
    x=MaxPooling2D(pool_size=(3,3), strides=(2,2), name="pool2")(x)
    x=BatchNormalization()(x)
    
    #conv3
    x= ZeroPadding2D((1, 1))(x)
    x=Conv2D(filters=384, kernel_size=(3,3), strides=(1,1), name="conv3",activation="relu")(x)
    
    #conv4
    x= ZeroPadding2D((1, 1))(x)
    con4_split1 = Lambda(lambda z: z[:,:,:,:192])(x)
    con4_split2 = Lambda(lambda z: z[:,:,:,192:])(x)
    x=Concatenate(axis=0)([con4_split1, con4_split2])
    x=Conv2D(filters=384, kernel_size=(3,3), strides=(1,1), name="conv4",activation="relu")(x)
    
    #con5
    x= ZeroPadding2D((1, 1))(x)
    con5_split1 = Lambda(lambda z: z[:,:,:,:192])(x)
    con5_split2 = Lambda(lambda z: z[:,:,:,192:])(x)
    x=Concatenate(axis=0)([con5_split1, con5_split2])
    x=Conv2D(filters=256, kernel_size=(3,3), strides=(1,1), name="conv5",activation="relu")(x)
    #pool5
    x=MaxPooling2D(pool_size=(3,3), strides=(2,2), name="pool5")(x)
    x=Flatten()(x)
    
    #fc6
    x=Dense(4096,activation='relu',name="fc6")(x)
    #dropout6
    x=Dropout(0.5,name="droupout6")(x)
    #fc7
    x=Dense(4096,activation='relu',name="fc7")(x)
    #dropout7
    x=Dropout(0.5,name="droupout7")(x)
    #fc8
    x=Dense(1000,activation='softmax',name="fc8")(x)
    model=Model(inputs=model_input, outputs=x)
    model.summary()
    model.load_weights("caffeNet_kerasWeight.h5",by_name=True)
    

    【讨论】:

    • 我可以将我从 caffe 转换为 keras 的重量加载到模型中。但是当我用它来预测它有这样的错误时。-->“ValueError:无法将输入数组从形状(8,1000)广播到形状(1,1000)”
    • 您的输入大小是否与您的批量大小相匹配?
    • 我用单个图像预测。我认为我的工具在x=Concatenate(axis=0)([split1, split2]) 是错误的,因为使用axis = 0。所以下一层将看到输入形状为(2,featuremap_width,featuremap_size,featuremap_channel),这意味着层将看到输入有batch=2。因此,我认为在 keras 中实现具有预训练图像网权重的 caffenet 的唯一方法需要将 Conv2D 拆分到每个 Lambda 层,并将预训练权重拆分到每个拆分后的 Conv2D,然后在此 REF 中的选项 1 之后连接 2 输出:groups.google.com/forum/#!topic/keras-users/bxPA4_Bda14。你有什么意见吗?
    • split Conv2D to each Lambda layer and split pretrain weight to each splited Conv2D and then concat 2 output after thaht like option 1。也许你是对的,根据papers.nips.cc/paper/…的图2,两个48层的特征图经过单独的卷积层,然后连接起来。
    猜你喜欢
    • 1970-01-01
    • 2018-11-13
    • 2018-07-13
    • 2015-11-28
    • 2020-01-12
    • 2020-02-20
    • 2019-06-27
    • 2021-04-12
    • 2020-01-12
    相关资源
    最近更新 更多