Keras / Theano: Como adicionar camadas Convolution2D?

votos
1

Im tendo problemas sobre como entender como Camadas de convolução são adicionados. Estou tentando adicionar camadas Convolução mas eu recebo este erro:

ValueError: GpuCorrMM shape inconsistency:
  bottom shape: 128 32 30 30
  weight shape: 3 32 3 3
  top shape: 128 1 28 28 (expected 128 3 28 28)

Apply node that caused the error: GpuCorrMM_gradInputs{valid, (1, 1)}(GpuContiguous.0, GpuContiguous.0)
Inputs types: [CudaNdarrayType(float32, 4D), CudaNdarrayType(float32, 4D)]
Inputs shapes: [(3, 32, 3, 3), (128, 1, 28, 28)]
Inputs strides: [(288, 9, 3, 1), (784, 0, 28, 1)]
Inputs values: ['not shown', 'not shown']

Estou tentando entender o que é nb_filter, STACK_SIZE, nb_row, nb_col estão em uma camada convolucional.

Meu objetivo é copiar o modelo VGG.

model = Sequential()

model.add(Convolution2D(32, 1, 3, 3, border_mode='full'))
model.add(Activation('relu'))
model.add(Convolution2D(32, 32, 3, 3))
model.add(Activation('relu'))
model.add(MaxPooling2D(poolsize=(2, 2)))
model.add(Dropout(0.25))

model.add(Convolution2D(64, 32, 3, 3, border_mode='full'))
model.add(Activation('relu'))
model.add(Convolution2D(64, 64, 3, 3))
model.add(Activation('relu'))
model.add(MaxPooling2D(poolsize=(2, 2)))
model.add(Dropout(0.25))

model.add(Flatten())
model.add(Dense(64*8*8, 512))
model.add(Activation('relu'))
model.add(Dropout(0.5))

model.add(Dense(512, nb_classes))
model.add(Activation('softmax'))

# let's train the model using SGD + momentum (how original).
sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='categorical_crossentropy', optimizer=sgd)

- Im usando atualmente Theano e keras.

Por favor, qualquer sugestão é apreciado.

Publicado 28/06/2015 em 23:36
fonte usuário
Em outras línguas...                            


1 respostas

votos
0

Você precisa corrigir o formato de saída para a camada convolucional. A produção de uma camada CNN depende de muitos factores tais como o tamanho da entrada, número de grãos, passo e estofamento. Geralmente, para uma entrada de tamanho BxCxW1xH1, a saída seria BxFxW2xH2 onde B é o tamanho do lote, C é os canais de entrada, M é o número de funções de saída, W1xH1 é o tamanho de entrada e pode calcular o valor de W2 e H2 usando W1, H1, passo e estofamento. Ele é ilustrado muito bem neste tutorial de Stanford: http://cs231n.github.io/convolutional-networks/#comp

Espero que ajude!

Respondeu 19/01/2017 em 04:00
fonte usuário

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