2016-11-13 85 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%肯定你想什麼來實現,但如果你想圖片的二元分類,嘗試設置class_modebinary。來自documentation

class_mode:「categorical」,「binary」,「sparse」或None之一。默認值: 「分類」。確定返回的標籤數組的類型: 「categorical」將是2D單熱編碼標籤,「binary」將是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。沒有提供上面的錯誤,而分類給出了這個錯誤。 >>異常:檢查模型輸入時出錯:期望的dense_input_1有2個維度,但有形狀的數組(1L,64L,64L,1L) 關於如何解決它的任何想法? – Weij

1

這個問題應該由數據尺寸不匹配造成的。 ImageDataGenerator實際加載圖像文件並將其放入(num_image_channel,image_height,image_width)形狀的numpy數組中。但是你的第一層是一個密集連接層,它正在尋找一維陣列形式的輸入數據,或者尋找具有多個樣本的二維陣列。所以基本上你會錯過你的輸入層,它會以正確的形狀輸入。

更改下面的代碼行

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

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')) 

你必須定義img_channel,這是你的圖像通道的數量。上述代碼還假定您正在使用thdim_ordering。如果您正在使用tf輸入維度排序,你就必須改變輸入重塑層

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

---舊的答案 -

你可能已經把訓練數據和驗證數據到子文件夾下trainvalidation,這是Keras不支持的。所有培訓數據應位於同一個文件夾中,對於驗證數據也是如此。

詳情請參閱this Keras tutorial

+0

[documentation](https://keras.io/preprocessing/image/)使用與問題中給出的代碼相同的目錄結構。 –

+0

這兩行代碼可能有問題。 'nb_train_samples = sum([len(files)for os in os in。步驟(train_data_dir)]) nb_validation_samples = sum([len(文件)for os.walk(validation_data_dir)]中的文件]' OP需要檢查輸出。 – pyan

+0

不要認爲這應該是一個問題,它只是返回一個整數。 –