2017-12-27 14 views
1

this 문서를 기반으로 이미지 분할 작업을 위해 Keras를 사용하여 CNN을 작성하려고합니다. 내 데이터 세트가 작기 때문에 Keras ImageDataGenerator을 사용하고 fit_generator()으로 보내고 싶습니다. 그래서 Kerac 웹 사이트의 example을 따랐습니다. 그러나 이미지와 마스크 제너레이터를 압축하지 못했기 때문에이 answer을 따라 제 자신의 생성기를 만들었습니다.Keras CNN 치수 문제

입력 데이터의 크기는 (701,256,1)이고 이진 (전경, 배경)입니다. 각 이미지마다 동일한 모양의 레이블이 있습니다.

이제 차원 문제에 직면하고 있습니다. 이것도 answer에 언급되었지만 해결 방법이 확실하지 않습니다.

오류 : 나는 전체 코드를 붙여하고

ValueError: Error when checking target: expected dense_3 to have 2 dimensions, but got array with shape (2, 704, 256, 1) 

여기 있습니다

import numpy 
import pygpu 
import theano 
import keras 

from keras.models import Model, Sequential 
from keras.layers import Input, Dense, Dropout, Activation, Flatten 
from keras.layers import Conv2D, MaxPooling2D, Reshape 
from keras.layers import BatchNormalization 
from keras.preprocessing.image import ImageDataGenerator 

from keras.utils import np_utils 
from keras import backend as K 

def superGenerator(image_gen, label_gen): 
    while True: 
     x = image_gen.next() 
     y = label_gen.next() 
     yield x[0], y[0] 


img_height = 704 
img_width = 256 

train_data_dir = 'Dataset/Train/Images' 
train_label_dir = 'Dataset/Train/Labels' 
validation_data_dir = 'Dataset/Validation/Images' 
validation_label_dir = 'Dataset/Validation/Labels' 
n_train_samples = 1000 
n_validation_samples = 500 
epochs = 50 
batch_size = 2 

input_shape = (img_height, img_width,1) 
target_shape = (img_height, img_width) 

model = Sequential() 

model.add(Conv2D(80,(28,28), input_shape=input_shape)) 
model.add(BatchNormalization()) 
model.add(Activation('relu')) 
model.add(MaxPooling2D(pool_size=(2,2), strides=(2,2))) 

model.add(Conv2D(96,(18,18))) 
model.add(BatchNormalization()) 
model.add(Activation('relu')) 
model.add(MaxPooling2D(pool_size=(2,2), strides=(2,2))) 

model.add(Conv2D(128,(13,13))) 
model.add(BatchNormalization()) 
model.add(Activation('relu')) 
model.add(MaxPooling2D(pool_size=(2,2),strides=(2,2))) 


model.add(Conv2D(160,(8,8))) 
model.add(BatchNormalization()) 
model.add(Activation('relu')) 
model.add(MaxPooling2D(pool_size=(2,2))) 

model.add(Flatten()) 

model.add(Dense(1024, activation='relu')) 
model.add(Dense(512, activation='relu')) 
model.add(Dropout(0.25)) 

model.add(Dense(2, activation='softmax')) 

model.summary() 

model.compile(loss='binary_crossentropy', optimizer='nadam', metrics=['accuracy']) 

data_gen_args = dict(
    rescale=1./255, 
    horizontal_flip=True, 
    vertical_flip=True 
    ) 

train_datagen = ImageDataGenerator(**data_gen_args) 
train_label_datagen = ImageDataGenerator(**data_gen_args) 
test_datagen = ImageDataGenerator(**data_gen_args) 
test_label_datagen = ImageDataGenerator(**data_gen_args) 

seed = 1 

train_image_generator = train_datagen.flow_from_directory(
    train_data_dir, 
    target_size=target_shape, 
    color_mode='grayscale', 
    batch_size=batch_size, 
    class_mode = 'binary', 
    seed=seed) 
train_label_generator = train_label_datagen.flow_from_directory(
    train_label_dir, 
    target_size=target_shape, 
    color_mode='grayscale', 
    batch_size=batch_size, 
    class_mode = 'binary', 
    seed=seed) 

validation_image_generator = test_datagen.flow_from_directory(
    validation_data_dir, 
    target_size=target_shape, 
    color_mode='grayscale', 
    batch_size=batch_size, 
    class_mode = 'binary', 
    seed=seed) 

validation_label_generator = test_label_datagen.flow_from_directory(
    validation_label_dir, 
    target_size=target_shape, 
    color_mode='grayscale', 
    batch_size=batch_size, 
    class_mode = 'binary', 
    seed=seed) 

train_generator = superGenerator(train_image_generator, train_label_generator,batch_size) 
test_generator = superGenerator(validation_image_generator, validation_label_generator,batch_size) 

model.fit_generator(
    train_generator, 
    steps_per_epoch= n_train_samples // batch_size, 
    epochs=50, 
    validation_data=test_generator, 
    validation_steps=n_validation_samples // batch_size) 

model.save_weights('first_try.h5') 

내가 Keras (및 CNNs)에 새로운 오전, 그래서 어떤 도움은 매우 극명하게 될 것이다.

+0

무엇이 오류입니까? – Nain

+0

질문이 업데이트되었습니다. 감사 :) – Maja

답변

1

확인. 나는 rubberduck 디버깅을하고 몇 가지 더 많은 기사를 읽었다. 물론 차원이 문제였습니다. This 간단한 답변으로 저에게 해 주셨습니다. 내 레이블은 입력 이미지와 모양이 같아서 모델의 출력도 그 모양이어야합니다. 이 문제를 해결하기 위해 Conv2DTranspose을 사용했습니다.