2017-01-30 6 views
0

Keras로 신경망에 데이터를 '전송'하려고합니다. .flow_from_directory 메소드를 사용하고 있는데이 프로세스는 나에게 적합합니다. 나는 (내가 tensorflow을 사용하고 있습니다)을 keras 문서에서 기본 예제를 사용하고 있습니다 :ImageDataGenerator로 Keras 차원이 일치하지 않습니다.

ROWS = 64 
COLS = 64 
CHANNELS = 3 

from keras.preprocessing.image import ImageDataGenerator 
train_datagen = ImageDataGenerator(
    rescale=1./255) 

test_datagen = ImageDataGenerator(rescale=1./255) 

train_generator = train_datagen.flow_from_directory(
    'train', 
    target_size=(64, 64), 
    batch_size=32, 
    class_mode='binary') 

validation_generator = test_datagen.flow_from_directory(
    '../tutorial/l1/kaggle_solutions/dogs_vs_cats/valid', 
    target_size=(64, 64), 
    batch_size=1, 
    class_mode='binary') 
from keras.models import Sequential 
from keras.layers import Convolution2D 
from keras.layers import Dense, Activation, Flatten, Dropout, MaxPooling2D 
from keras.regularizers import l2 

model = Sequential() 
model.add(Convolution2D(4, 4, 4, border_mode='same', input_shape=(64, 64,3), activation='relu')) 
from keras.utils.np_utils import to_categorical 
from keras.optimizers import SGD, RMSprop 

model.compile(loss='binary_crossentropy', optimizer=RMSprop(lr=1e-4), metrics=['accuracy']) 


model.fit_generator(
    train_generator, 
    samples_per_epoch=2500, 
    nb_epoch=20, 
    validation_data=validation_generator, 
    nb_val_samples=3100) 

이 내가 다음과 같은 오류가 실행 : 나는 오랜 시간과 발견을 위해 주변에 땜질 된

Exception: Error when checking model target: expected convolution2d_84 to have 4 dimensions, but got array with shape (32, 1) 

다음과 같이 'model.add'를 그레이 스케일 입력으로 바꿈 model.add (Convolution2D (4, 4, 4, border_mode = '동일', input_shape = (64, 64,3), 활성화 = 'relu')) 은 다음과 같은 오류를 표시합니다 (예상대로 - 원래 입력이 맞았 음을 나타냄) :

Error when checking model input: expected convolution2d_input_49 to have shape (None, 64, 64, 1) but got array with shape (32, 64, 64, 3) 

그래서 원본과 32,64,64,3의 4-d 배열을 전달하지만 원래 의미하는 오류가 발생합니다 예상 (1,64,64, 3) and got (32,64,64,3)

데이터를 32 개 배치로 보내고 있습니다. 배치를 0으로 설정하면 이상하게도 충분합니다 (0,64,64,3 입력을 제공함). 그 BATCH_SIZE (fit_generator를 사용할 때 내가 모델에 배치 크기를 통과 할 수 있으며이 나타납니다 - 문서를 바탕으로

Exception: Error when checking model target: expected convolution2d_87 to have 4 dimensions, but got array with shape (0, 1) 

, 내가 모델로 데이터 흐름하는 적절한 방법을 알아낼 수 없습니다 : 수 넘버 샘플) 문제입니다.

도움을 주시면 감사하겠습니다.

답변

1

ImageDataGenerator에는 문제가 없습니다. 오류 메시지에 명시된 바와 같이 모델 출력의 모양과 대상의 모양이 일치하지 않습니다. class_mode = 'binary'을 사용하므로 모델의 예상 출력은 단일 값이지만 대신 하나의 길쌈 레이어가 있고 모델에는 다른 것이 없으므로 모양의 출력은 (batch_size, 64, 64, 4)입니다. 이 같은

시도 뭔가 :

model.add(Convolution2D(4, 4, 4, border_mode='same', input_shape=(64, 64,3), activation='relu')) 
model.add(Flatten()) 
model.add(Dense(1)) 
model.add(Activation('sigmoid')) 
+0

그게 아마 좋은 점은 내가 (내가 말했듯이, 나는 매우 실망했다) 내 그물의 내 상위 레이어를 찢어했고 그냥 확인했다. 결국, 나는 "제너레이터"를 "바이너리"에서 "카테고리"로 전환하고 커널을 다시 시작해야했다. 심지어 지금은 바이너리가 작동하지 않습니다 -하지만 당신이 올바르게 입력 된 모양과 관련이 있다고 제안했다. 나는이 대답을 "받아 들일"것이지만, 문제의 레이블 이었지만 그것이 "입력"이었다. 나는 당신이 이것에 대해 조사해 주셔서 대단히 감사합니다. fit_generator 예제가 많지 않습니다. 내 예를 기다리는 딸랑 딸랑이있다. – RDS

관련 문제