2016-11-13 13 views
1
import os 
from keras.preprocessing.image import ImageDataGenerator 
from keras.models import Sequential 
from keras.layers import Convolution2D, MaxPooling2D 
from keras.layers import Activation, Dropout, Flatten, Dense 

img_width, img_height = 64, 64 

train_data_dir = 'data/train' 
validation_data_dir = 'data/validation' 
nb_train_samples = sum([len(files) for files in os.walk(train_data_dir)]) 
nb_validation_samples = sum([len(files) for files in os.walk(validation_data_dir)]) 
nb_epoch = 10 


model = Sequential() 
model.add(Dense(4096, input_dim = 4096, init='normal', activation='relu')) 
model.add(Dense(4,init='normal',activation='softmax')) 
model.compile(loss='categorical_crossentropy', 
       optimizer='adam', 
       metrics=['accuracy']) 


train_datagen = ImageDataGenerator(
     rescale=1./255, 
     ) 


test_datagen = ImageDataGenerator(rescale=1./255) 

train_generator = train_datagen.flow_from_directory(
     train_data_dir, 
     color_mode="grayscale", 
     target_size=(img_width, img_height), 
     batch_size=1, 
     class_mode=None) 

validation_generator = test_datagen.flow_from_directory(
     validation_data_dir, 
     color_mode="grayscale", 
     target_size=(img_width, img_height), 
     batch_size=1, 
     class_mode=None) 

model.fit_generator(
     train_generator, 
     samples_per_epoch=nb_train_samples, 
     nb_epoch=nb_epoch, 
     validation_data=validation_generator, 
     nb_val_samples=nb_validation_samples) 

上記のコードでは、すべてmodel.fit_generator()までうまく動作します。それから、それに続くようなエラーが発生します。model.fit_generator()形状エラー

Traceback (most recent call last): 
    File "C:/Users/Sam/PycharmProjects/MLP/Testing Code without CNN.py", line 55, in <module> 
    nb_val_samples=nb_validation_samples) 
    File "C:\Python27\lib\site-packages\keras\models.py", line 874, in fit_generator 
    pickle_safe=pickle_safe) 
    File "C:\Python27\lib\site-packages\keras\engine\training.py", line 1427, in fit_generator 
    'or (x, y). Found: ' + str(generator_output)) 
Exception: output of generator should be a tuple (x, y, sample_weight) or (x, y). Found: [[[[ 0.19215688] 
+1

このコードは何をすべきですか?例を教えてください。 –

答えて

0

私はあなたが達成しようとしているものを100%わからないが、あなたは画像のバイナリ分類をしようとしている場合は、binaryclass_modeを設定してみてください。 documentation

class_mode:「カテゴリ」、「バイナリ」、「スパース」または「なし」のいずれか。デフォルト: "カテゴリ"。返されるラベル配列のタイプを決定します。 "カテゴリ"は2Dホットコード化ラベル、 "バイナリ"は1D バイナリラベル、 "スパース"は1D整数ラベルになります。

エラーメッセージは少し混乱していますが、source codeを見れば、それが明確になる:

if not hasattr(generator_output, '__len__'): 
        _stop.set() 
        raise Exception('output of generator should be a tuple ' 
            '(x, y, sample_weight) ' 
            'or (x, y). Found: ' + str(generator_output)) 
+0

返信いただきありがとうございます!列車内のサブフォルダと検証フォルダに従って画像を分類しようとしており、合計4つのサブフォルダがあります。私はclass_modeをNone、CategoricalとBinaryの使用を試みました。カテゴリにはこのエラーがありますが、Noneは上記のエラーを示します。 >>例外:モデルの入力をチェックしているときにエラーが発生しました:dense_input_1は2次元であると予想されましたが、形状(1L、64L、64L、1L)の配列が得られました 解決方法はありますか? – Weij

1

問題は、データの次元の不一致が原因で発生する必要があります。 ImageDataGeneratorは実際に画像ファイルをロードし、(num_image_channel、image_height、image_width)の形のnumpy配列に入れます。しかし、最初のレイヤーは密接に接続されたレイヤーで、1D配列の形の入力データ、または多数のサンプルを持つ2D配列を探しています。したがって、本質的に入力レイヤーが欠落しています。入力レイヤーは正しい形で入力されます。あなたのイメージのチャンネル数がある

変更img_channelを定義するための

model.add(Reshape((img_width*img_height*img_channel), input_shape=(img_channel, img_height, img_width))) 
model.add(Dense(4096, init='normal', activation='relu')) 

あなたが持っているコード

model.add(Dense(4096, input_dim = 4096, init='normal', activation='relu')) 

の次の行、。上記のコードでは、dim_orderingthであることを前提としています。あなたはtf入力次元の順序付けを使用している場合、あなたは

model.add(Reshape((img_width*img_height*img_channel), input_shape=(img_height, img_width, img_channel))) 

への入力再形成層を変更する必要があります---古い答え -

おそらくtrain下のサブフォルダに訓練データと検証データを入れていますでサポートされていないvalidationです。すべてのトレーニングデータは、検証データと同じ1つのフォルダに保存する必要があります。

詳細については、this Keras tutorialを参照してください。

+0

[documentation](https://keras.io/preprocessing/image/)は、質問に記載されているコードと同じディレクトリ構造を使用しています。 –

+0

これらの2行のコードは問題がある可能性があります。 'nb_train_samples = sum([oenのファイルのlen(files)]。 OPは出力をチェックする必要があります。この場合、OPは出力をチェックする必要があります。 – pyan

+0

これが問題であるとは思わない、ちょうど整数を返します。 –