2017-04-18 22 views
0

65536行(それぞれ1イメージを表す)、49列(7x7イメージ)およびバイナリクラス(50列)のデータセットにCNNモデルを構築する必要があります。 (テストセット用の7800行)ValueError:CorrMM:不可能な出力形状

mnistデータセットを使用してCNNを実行する場合の例を参照していますが、列車モデルの構築に失敗しました。ここで

は私のコードです:

from __future__ import print_function 
import keras 
from keras.models import Sequential 
from keras.layers import Dense, Dropout, Flatten 
from keras.layers import Conv2D, MaxPooling2D 
from keras.utils import np_utils 
from keras import backend as K 
K.set_image_dim_ordering('th') 
import pandas as pd 
import numpy as np 



# input image dimensions 
img_rows, img_cols = 7, 7 

# fix random seed for reproducibility 
seed = 7 
np.random.seed(seed) 

x_train = pd.read_csv('palm_3x3_test.csv') 
x_train.drop(['class'],axis=1,inplace=True) 

x_train = x_train.as_matrix().reshape(-1,7, 7) 

y_train = pd.read_csv('palm_3x3_test.csv') 
y_train = y_train[['class']] 


x_test = pd.read_csv('palm_3x3_data.csv') 
x_test.drop(['class'],axis=1,inplace=True) 
x_test = x_test.as_matrix().reshape(-1,7, 7) 

y_test = pd.read_csv('palm_3x3_data.csv') 
y_test = y_test[['class']] 


# reshape to be [samples][pixels][width][height] 
x_train_final = x_train.reshape(x_train.shape[0],1,7,7).astype('float32') 
x_test_final = x_test.reshape(x_test.shape[0],1,7, 7).astype('float32') 

print(x_train.shape) 
print(x_test.shape) 
print(x_train_final.shape) 
print(x_test_final.shape) 
print(y_train.shape) 
print(y_test.shape) 

# normalize inputs from 0-255 to 0-1 
x_train_final = x_train_final/255 
x_test_final = x_test_final/255 

# one hot encode outputs 
y_train = np_utils.to_categorical(y_train) 
y_test = np_utils.to_categorical(y_test) 
num_classes = y_test.shape[1] 

print (y_test.shape) 
print(y_train.shape) 

def baseline_model(): 
#  create model 

    model = Sequential() 
    model.add(Conv2D(30,(5,5), padding='valid', activation='relu',input_shape=(1,7,7))) 
    model.add(MaxPooling2D(pool_size=(2, 2))) 
    model.add(Conv2D(15 ,(3, 3), activation='relu')) 
    model.add(MaxPooling2D(pool_size=(2, 2))) 
    model.add(Dropout(0.2)) 
    model.add(Flatten()) 
    model.add(Dense(128, activation='relu')) 
    model.add(Dense(50, activation='relu')) 
    model.add(Dense(num_classes, activation='softmax')) 

    # Compile model 
    model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) 
    return model 

# build the model 
model = baseline_model() 
# Fit the model 
model.fit(x_train_final,y_train, validation_data=(x_test_final,y_test), nb_epoch=10, batch_size=200,verbose=2) 
# Final evaluation of the model 
scores = model.evaluate(x_test,y_test, verbose=0) 
print("CNN Error: %.2f%%" % (100-scores[1]*100)) 

私はTheanoを使用していますし、私のデータの出力形状は次のとおりです。

x_train.shape = (65536L, 7L, 7L) 
x_test.shape = (7800L, 7L, 7L) 
x_train_final.shape = (65536L, 1L, 7L, 7L) 
x_test_final.shape = (7800L, 1L, 7L, 7L) 
y_train.shape = (65536L, 2L) 
y_test.shape = (7800L, 2L) 

私はそれがプロンプトエラー実行中:

ValueError: CorrMM: impossible output shape 
    bottom shape: 200 x 30 x 1 x 1 
    weights shape: 15 x 30 x 3 x 3 
    top shape: 200 x 15 x -1 x -1 

答えて

1

2番目の畳み込みレイヤーへの入力は、適用するフィルターよりも小さくなります。入力画像は(7,7)です。 (5,5)フィルタを使用してvalidのパディングを使用すると、フィルタリングされた画像が(3,3)になります。最大プールを適用すると、フィルタサイズが(3,3)のセカンダリコンボリューションレイヤと互換性がない(1,1)イメージが残ります。

モデルをコンパイルした後にmodel.summary()を実行すると、各レイヤの出力シェイプが表示されます。負の形状の場合は、impossible output shapeエラーが表示されます。

padding='valid'からpadding='same'を第1の畳み込み層で変更します。これで問題は完全に解決されるわけではありません。また、完全に接続されたレイヤーの出力が確実になるように、2番目の畳み込みレイヤーのパディングを変更する必要があります。イメージのサイズが小さい場合は、最大プールの使用を再検討することをお勧めします。

This questionは、有効なパディングと同じパディングの違いについての説明です。

関連する問題