Python Keras como transformar uma densa camada em uma camada convolutional

votos
8

I têm um problema para encontrar o mapeamento correcto dos pesos a fim de transformar uma camada densa em uma camada convolucional.

Este é um trecho de um ConvNet que eu estou trabalhando em:

model.add(Convolution2D(512, 3, 3, activation='relu'))
model.add(MaxPooling2D((2,2), strides=(2,2)))
model.add(Flatten())
model.add(Dense(4096, activation='relu'))

Após a MaxPooling, a entrada é de forma (512,7,7). Eu gostaria de transformar a camada densa em uma camada convolutional para torná-lo parecido com este:

model.add(Convolution2D(512, 3, 3, activation='relu'))
model.add(MaxPooling2D((2,2), strides=(2,2)))
model.add(Convolution2D(4096, 7, 7, activation='relu'))

No entanto, eu não sei como eu preciso remodelar os pesos, a fim de mapear corretamente os pesos achatadas ao (4096,512,7,7) estrutura que é necessária para a camada convolutional? Neste momento, os pesos da camada densa são de dimensão (25088,4096). Preciso de alguma forma mapear estas 25088 elementos para uma dimensão de (512,7,7) preservando ao mesmo tempo o mapeamento correcto dos pesos para os neurónios. Até agora, eu tentei várias maneiras de remodelar e depois transpor, mas eu não tenho sido capaz de encontrar o mapeamento correto.

Um exemplo do que eu tenho tentado seria esta:

weights[0] = np.transpose(np.reshape(weights[0],(512,7,7,4096)),(3,0,1,2))

mas não mapeia os pesos corretamente. I verificado se o mapeamento estiver correta, comparando a saída para ambos os modelos. Se feito corretamente, espero que a saída deve ser o mesmo.

Publicado 01/05/2016 em 10:58
fonte usuário
Em outras línguas...                            


1 respostas

votos
6

Ainda à procura de solução? Aqui está:

new_conv_weights = dense_weights.transpose(1,0).reshape(new_conv_shape)[:,:,::-1,::-1]

no seu caso:

weights[0] = weights[0].transpose(1,0).reshape((4096,512,7,7))[:,:,::-1,::-1]

A parte complicada é filtros conv flipping [:,:, :: - 1, :: - 1]. Théano faz convolução não correlação (por exemplo, ao contrário de caffe). Por isso, em Keras filtrar como:

1 0
0 0

aplicada a matriz:

1 2 3 4 5
6 7 8 9 0
1 2 3 4 5

resulta em matriz:

7 8 9 0 
2 3 4 5

Não é este, como seria de esperar com correlação:

1 2 3 4
6 7 8 9

A fim de fazer as coisas funcionarem como esperado, você precisa girar filtros 180 graus. Apenas resolvido este problema para mim, espero que isto vai ser de grande ajuda para você ou para os outros. Felicidades.

Respondeu 25/07/2016 em 20:39
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more