web-dev-qa-db-ja.com

'conv2d_2 / convolution'の1から3を引くことによって生じる負の次元サイズ

Kerasで入力レイヤーを宣言すると、このエラーメッセージが表示されます。

ValueError:入力形状:[?、1,28,28]、[3,3,28,32]の 'conv2d_2/convolution'(op: 'Conv2D')の1から3を引くことによって負の次元サイズが発生しました。

私のコードはこんな感じ

model.add(Convolution2D(32, 3, 3, activation='relu', input_shape=(1,28,28)))

サンプルアプリケーション: https://github.com/IntellijSys/tensorflow/blob/master/Keras.ipynb

13
Mohammad Nurdin

デフォルトでは、Convolution2D( https://keras.io/layers/convolutional/ )は、入力が「channels-last」である形式(サンプル、行、列、チャネル)であることを想定しています。データは形式(サンプル、チャネル、行、列)にあるようです。 Convolution2Dレイヤーを宣言するときに、オプションのキーワードdata_format = 'channels_first'を使用してこれを修正できるはずです。

model.add(Convolution2D(32, (3, 3), activation='relu', input_shape=(1,28,28), data_format='channels_first'))
30
ml4294

私は同じ問題を抱えていましたが、このスレッドで提供されている解決策は役に立ちませんでした。多くのことを考えた後、私の場合、それを解決する解決策を見つけました。

開始するには、ここに私のコードがあります(私はそれが良くないことを知っています、私はまだ学んでいます)

imageSize=32
classifier=Sequential() 

classifier.add(Conv2D(64, (3, 3), input_shape = (imageSize, imageSize, 3), activation = 'relu'))
classifier.add(MaxPooling2D(pool_size = (2, 2)))

classifier.add(Conv2D(64, (3, 3), activation = 'relu'))
classifier.add(MaxPooling2D(pool_size = (2, 2)))

classifier.add(Conv2D(64, (3, 3), activation = 'relu')) 
classifier.add(MaxPooling2D(pool_size = (2, 2)))

classifier.add(Conv2D(64, (3, 3), activation = 'relu')) 
classifier.add(MaxPooling2D(pool_size = (2, 2)))

classifier.add(Conv2D(64, (3, 3), activation = 'relu')) 
classifier.add(MaxPooling2D(pool_size = (2, 2)))

classifier.add(Flatten())

そして、あらゆる可能性を試した後、私はエラーを見つけました:

画像サイズは32 x 32です。最初の畳み込み層の後、30 x 30に縮小しました(畳み込みが正しく理解できたら、と思います)

次に、プーリング層はそれを半分に減らし、15 x 15です。

など..最後に、私の機能マップは非常に小さいため、プール層(または畳み込み層)は大きすぎて超えられません-エラーが発生します

したがって、画像サイズを大きくするか、畳み込み層またはプーリング層を減らすことで、エラーを簡単に解決できました。

16
charel-f

Kerasは以下のバックエンド互換性で利用可能です:

TensorFlow:グーグルによる、Theano:リサ・ラボによる開発、CNTK:マイクロソフトによる

[?、X、X、X]、[X、Y、Z、X]でエラーが表示されるたびに、これを修正するためのチャネルの問題はKerasの自動モードを使用します。

インポート

from keras import backend as K
K.set_image_dim_ordering('th')

「tf」形式は、畳み込みカーネルが形状(行、列、入力深度、深さ)を持つことを意味します

これは常に機能します...

4
Reeves