Keras CNN imagens e incompatibilidade de tamanho do kernel, mesmo depois de transformação de imagem para caber

votos
6

Eu estou tentando executar um CNN semelhante ao que na Keras documantation convnet VGG-like , mas para um conjunto personalizado de imagens e classificação binária em vez de uma saída 10-classe.

Quando eu tentar encaixar a CNN, eu recebo este erro longwinded que assumo está me dizendo o meu tamanho da imagem de entrada não é o tamanho certo para a entrada CNN.

ValueError: GpuDnnConv images and kernel must have the same stack size

Apply node that caused the error: GpuDnnConv{algo='small', inplace=True}(GpuContiguous.0, GpuContiguous.0, GpuAllocEmpty.0, GpuDnnConvDesc{border_mode='valid', subsample=(1, 1), conv_mode='conv', precision='float32'}.0, Constant{1.0}, Constant{0.0})
Toposort index: 130
Inputs types: [CudaNdarrayType(float32, 4D), CudaNdarrayType(float32, 4D), CudaNdarrayType(float32, 4D), <theano.gof.type.CDataType object at 0x7f0eefc8d790>, Scalar(float32), Scalar(float32)]
Inputs shapes: [(32, 232, 300, 3), (300, 1, 3, 3), (32, 300, 298, 1), 'No shapes', (), ()]
Inputs strides: [(208800, 900, 3, 1), (9, 0, 3, 1), (89400, 298, 1, 0), 'No strides', (), ()]
Inputs values: ['not shown', 'not shown', 'not shown', <PyCObject object at 0x7f0efaba8e68>, 1.0, 0.0]
Inputs name: ('image', 'kernel', 'output', 'descriptor', 'alpha', 'beta')

A coisa é que eu pensei que reformulou todas as minhas imagens para caber. Minha entrada é uma pilha de 4000 232x300 px imagens RBG ea saída é uma matriz de 4000 boolean.

entrada :im_list.shape Out[49]: (4000, 232, 300, 3)

saída :np.asarray(cls).shape Out[50]: (4000,)

Esta é a função para construir a CNN

CNN = buildCNN(3, 232, 300, 2)
CNN.fit(im_list, cls, batch_size=32, nb_epoch=1)

    def buildCNN(depth,width,height,outputShape):
    CNN = Sequential()
        # input: 232x300 images with 3 channels -> (3, 100, 100) tensors.
        # this applies 32 convolution filters of size 3x3 each.
        CNN.add(Convolution2D(32, 3, 3, border_mode='valid', input_shape=(depth,width,height)))
        CNN.add(Activation('relu'))
        CNN.add(Convolution2D(32, 3, 3))
        CNN.add(Activation('relu'))
        CNN.add(MaxPooling2D(pool_size=(2, 2)))
        CNN.add(Dropout(0.25))
        #
        CNN.add(Convolution2D(64, 3, 3, border_mode='valid'))
        CNN.add(Activation('relu'))
        CNN.add(Convolution2D(64, 3, 3))
        CNN.add(Activation('relu'))
        CNN.add(MaxPooling2D(pool_size=(2, 2)))
        CNN.add(Dropout(0.25))
        #
        CNN.add(Flatten())
        # Note: Keras does automatic shape inference.
        CNN.add(Dense(256))
        CNN.add(Activation('relu'))
        CNN.add(Dropout(0.5))
        #
        CNN.add(Dense(outputShape))
        CNN.add(Activation('softmax'))
        #
        sgd = SGD(lr=0.1, decay=1e-6, momentum=0.9, nesterov=True)
        CNN.compile(loss='categorical_crossentropy', optimizer=sgd)
        #
    return CNN

Eu estive batendo a cabeça contra a parede com este tempo suficiente para que eu pensei que talvez alguém teve este problema. Alguma ideia? Desde já, obrigado.

Publicado 03/04/2016 em 23:31
fonte usuário
Em outras línguas...                            


2 respostas

votos
6

Você especificou entrada como (depth,width,height). Assim, a matriz que você deve deve ter dimensões (N,depth,width,height), onde N é o número de exemplos de treinamento.

A entrada na verdade você está passando, (4000, 232, 300, 3), não corresponde. Deve ser remodelada para ser (4000, depth, width, height). Isto significa que você vai ter que redimensionar cada imagem e reordenar os eixos.

Respondeu 04/04/2016 em 13:43
fonte usuário

votos
6

A resposta acima está correto: para a posteridade, o meu problema foi resolvido por um simples:

im_list = im_list.transpose((0,3,1,2))
Respondeu 05/04/2016 em 05:12
fonte usuário

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