2017-12-27 6 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を使ってこの問題を解決しました。

関連する問題