2016-04-04 34 views
6

CNNをKeras documantation "VGG-like convnet"に似ていますが、10クラスの出力ではなく、イメージとバイナリのカスタムセットで実行しようとしています。Keras CNNイメージとカーネルサイズの不一致が画像変換後にあっても

CNNに合うようにしようとすると、入力画像のサイズが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') 

私はすべてのイメージをフィットさせて再構成したと思っています。私の入力は4000 232x300 px RBGイメージのスタックで、出力は4000ブール値の配列です。

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

出力np.asarray(cls).shape Out[50]: (4000,)

これは私がこの長いと壁に頭を叩いてきた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 

を構築するための機能です私はおそらく他の誰かがこの問題を抱えていると思っていました。何かご意見は?前もって感謝します。

答えて

6

入力を(depth,width,height)と指定しました。配列は次元(N,depth,width,height)でなければなりません。ここで、Nはトレーニングの例です。

実際に渡している入力、(4000, 232, 300, 3)は一致しません。それは(4000, depth, width, height)になるように再構成する必要があります。つまり、各画像のサイズを変更し、軸を並べ替える必要があります。

+0

感謝を! – marko

6

上記の答えが正しい:後世のために、私の問題は、簡単なことで解決された:それを解決し

im_list = im_list.transpose((0,3,1,2)) 
関連する問題