This code combine image and mask for image detection?
How can i correct that error?
batch_size = x.shape[0] AttributeError: 'tuple' object has no attribute 'shape'
This is the code used for training:
train_datagen = ImageDataGenerator(
rescale=1. / 255,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True)
train_datagen_1 = ImageDataGenerator(
rescale=1. / 255,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True)
train_generator = train_datagen.flow_from_directory(
train_data_dir,
target_size=(200, 150),
batch_size=1
)
train_generator_1= train_datagen_1.flow_from_directory(
train_data_dir_1,
target_size=(200, 150),
batch_size=1)
train_generator_2 = zip( train_generator, train_generator_1)
model.fit_generator(
train_generator_2,
steps_per_epoch=nb_train_samples // batch_size,
epochs=50)
This is the model I'm using:
model = Sequential()
model.add(Conv2D(32, (3, 3), input_shape=(200, 150, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(20)) model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(90000))
model.add(Activation('sigmoid'))
model.compile(loss='mse', optimizer='rmsprop', metrics=['accuracy'])
So, since your model has only one output, you cannot join two generators like that.
(input,output)
in a tuple.((input1,output1), (input2,output2))
, tuples inside a tuple.When your model gets a batch from the generator, it's trying to get the shape of what it thinks is the
input
, but it finds(input,output)
instead.Working the generator:
You can probably create your own generator like this:
Instantiate it with:
Now, you're going to have real trouble with the output shapes. If you're working from image to image, I recommend you work with a purely convolutional model.
A convolutional layer outputs
(Batch, Side1, Side2, channels)
, which is the shape you are working with in your images.But a dense layer outputs
(Batch, size)
. This can only work if you reshape it later withReshape((200,150,3))
to match your "true images".Hint: a Dense 20 in the middle of the model may be too little to represent an entire image. (But of course it depends on your task).
A possible model from this task is:
Every convolution with
padding='same'
to make your life easier. (But since you have one dimension being 150, you will have to manage padding the values at some point, because when you reach 75, the MaxPooling will remove/add one pixel (75 cannot be divided by two).The selected answer is inaccurate. The reason why the code is failing is not because the tuples are of the
((input1,output1), (input2,output2)), ...)
, but because they are of the type(((input1, class1), (input2, class2), ...), ((output1, class1), (output2, class2), ...))
.You could have fixed your problem by simply adding
class_mode=None
to yourflow_from_directory
calls.