Как внедрить CaffeNet на Keras с предварительно подготовленным весом от Caffe - PullRequest
0 голосов
/ 06 января 2019

Я хочу внедрить caffeNet на керас с предварительной подготовкой на imagenet. Так что я получил вес от Cafe GitHub там https://github.com/BVLC/caffe/tree/master/models/bvlc_reference_caffenet

Я преобразую его в weight.h5 с помощью caffe_weight_converter. Вес, который я получил на слое «conv2», имеет форму (256,48,5,5), но мне нужна модель навесного оборудования (256,96,5,5).

Я видел из Смутился после того, как извлек веса из Обученного кофеена Это потому, что в слое "conv2" разделились на 2 группы. Я хочу спросить, что керас может разделить конвой слой на группу? или есть какое-нибудь решение, которое я могу получить предварительно обученный caffeNet на Керасе?

Ответы [ 2 ]

0 голосов
/ 16 января 2019

@ 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)
0 голосов
/ 15 января 2019

Я попытался реализовать нижнюю часть 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 в Keras Conv2D

Разделение вывода слоя по каналам

...