Profundo Convolucional Neural Network em Keras

votos
2

Oi im tentando aumentar a profundidade de um redes convolucionais existentes em keras. Abaixo está a rede existente:

model = Sequential()

model.add(Convolution2D(32, nb_conv, nb_conv, border_mode='valid', input_shape=(1, img_rows, img_cols)))
model.add(Activation('relu'))
model.add(Convolution2D(32, nb_conv, nb_conv))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(nb_pool, nb_pool)))
model.add(Dropout(0.25))

model.add(Convolution2D(64, nb_conv, nb_conv, border_mode='valid'))
model.add(Activation('relu'))
model.add(Convolution2D(64, nb_conv, nb_conv))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(nb_pool, nb_pool)))
model.add(Dropout(0.25))

model.add(Flatten())
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dropout(0.5))

model.add(Dense(256))
model.add(Activation('relu'))
model.add(Dropout(0.5))

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

model.compile(loss='categorical_crossentropy', optimizer='adadelta')

Eu estou tentando adicionar a profundidade da rede adicionando em algumas camadas de convolução como abaixo:

model = Sequential()

model.add(Convolution2D(32, nb_conv, nb_conv, border_mode='valid', input_shape=(1, img_rows, img_cols)))
model.add(Activation('relu'))
model.add(Convolution2D(32, nb_conv, nb_conv))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(nb_pool, nb_pool)))
model.add(Dropout(0.25))

model.add(Convolution2D(64, nb_conv, nb_conv, border_mode='valid'))
model.add(Activation('relu'))
model.add(Convolution2D(64, nb_conv, nb_conv))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(nb_pool, nb_pool)))
model.add(Dropout(0.25))

model.add(Convolution2D(128, nb_conv, nb_conv, border_mode='valid'))
model.add(Activation('relu'))
model.add(Convolution2D(128, nb_conv, nb_conv))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(nb_pool, nb_pool)))
model.add(Dropout(0.25))

model.add(Flatten())
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dropout(0.5))

model.add(Dense(256))
model.add(Activation('relu'))
model.add(Dropout(0.5))

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

model.compile(loss='categorical_crossentropy', optimizer='adadelta')

Keras está me dando um erro. Im não tem certeza o que é errado, mas parece que a forma tensor está errado. Abaixo está o erro.

This could be a known bug in CUDA, please see the GpuCorrMM() documentation.

Apply node that caused the error: GpuCorrMM{valid, (1, 1)}(GpuContiguous.0, GpuContiguous.0)
Toposort index: 181
Inputs types: [CudaNdarrayType(float32, 4D), CudaNdarrayType(float32, 4D)]
Inputs shapes: [(128, 128, 2, 2), (128, 128, 3, 3)]
Inputs strides: [(512, 4, 2, 1), (1152, 9, 3, 1)]
Inputs values: ['not shown', 'not shown']
Outputs clients: [[GpuElemwise{Add}[(0, 0)](GpuCorrMM{valid, (1, 1)}.0, GpuReshape{4}.0)]]

HINT: Re-running with most Theano optimization disabled could give you a back-trace of when this node was created. This can be done with by setting the Theano flag 'optimizer=fast_compile'. If that does not work, Theano optimizations can be disabled with 'optimizer=None'.
HINT: Use the Theano flag 'exception_verbosity=high' for a debugprint and storage map footprint of this apply node.

Minha entrada é de 28 por pixel de imagem 28. Alguém pode me apontar para o que está errado com o meu modelo?

Publicado 08/01/2016 em 03:44
fonte usuário
Em outras línguas...                            


2 respostas

votos
1

A resposta provavelmente tem a ver com o tamanho da imagem. MY tamanho da imagem é uma imagem de 28x28. Quando realizamos convolução e pooling (sem preenchimento zero), o tamanho dos mapas de características irá reduzir. Por conseguinte, o número de convolução e camada pooling será limitado, dependendo da dimensão da imagem de entrada.

Seguinte fórmula de http://cs231n.github.io/convolutional-networks/

O recurso de mapa de dimensões = K * ((W-F + 2P) / S + 1), em que W - tamanho do volume de entrada, F o tamanho do campo receptivo dos neurónios da camada Conv, S - o passo com o qual eles são aplicados, P - a quantidade de preenchimento com zeros utilizado na fronteira, K - a profundidade da camada de conv

Deixa nenhuma preocupação sobre a profundidade da camada de conv por agora. Nós apenas queremos calcular a altura ea largura dos mapas de características resultantes depois de cada [CONV -> CONV -> POOL]operação.

Para a primeira rede no topo I aplicado [CONV -> CONV -> POOL]duas vezes. Permite calcular o mapa característica resultante.

Dado F = 3, P = 0, S = 1, W = 28, a saída da primeira [CONV -> CONV -> POOL]operação é:

[CONV]

mapa dimensão característica = W-F + 2P) / S + 1 = (28-3 0 +) / 1 = 26

[CONV]

mapa dimensão característica = W-F + 2P) / S + 1 = (26-3 0 +) / 1 = 23

[POOL]

aplicando pooling operação resulta em 23/2 = 11

Isto implica que após a primeira [CONV -> CONV -> POOL]operação, o mapa recurso agora tem 11x11 pixels

Permite aplicar a segunda [CONV -> CONV -> POOL]operação para o mapa recurso 11x11. Nós achamos que vamos acabar com um mapa recurso de 2x2 pixels.

Agora, se nós tentamos aplicar a terceira [CONV -> CONV -> POOL]operação como o que eu queria fazer na segunda rede. Nós achamos que a dimensão do mapa recurso 2x2 é demasiado pequeno para outra [CONV -> CONV -> POOL]operação.

Eu acho que essa é a razão para o erro.

Aplicando a minha especulação acima i tentou treinar a segunda rede com imagem grande e o erro não aparece.

Respondeu 13/01/2016 em 01:26
fonte usuário

votos
2

Eu estou respondendo isso, porque eu não tenho rep suficiente para comentar. A fórmula para o cálculo do volume de saída está a ter um ligeiro questão. K * ((W-F + 2P) / S + 1) deve ser (K ​​* ((W-F + 2P) / S)) + 1.

Respondeu 13/08/2016 em 02:52
fonte usuário

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