1
votes

I am running a CNN that check for images but does not classify. In fact, the output layer is a dense layer that have as argument the size of the images in the labels in 1d.

As shown below in the code, I am using model.fit_generator() instead of model.fit and when it comes to start training the model the following error comes up:

ValueError: Error when checking target: expected dense_10 to have shape 
(1,) but got array with shape (19316,)

Why is this an error? The output of my dense is an array of 19316 elements, why does it expect it to have a shape of (1,) ?

Here attached is also the summary of the model :


Layer (type) Output Shape Param #

conv2d_28 (Conv2D) (None, 26, 877, 32) 544


activation_37 (Activation) (None, 26, 877, 32) 0


max_pooling2d_28 (MaxPooling (None, 13, 438, 32) 0


conv2d_29 (Conv2D) (None, 12, 437, 16) 2064


activation_38 (Activation) (None, 12, 437, 16) 0


max_pooling2d_29 (MaxPooling (None, 6, 218, 16) 0


conv2d_30 (Conv2D) (None, 5, 217, 8) 520


activation_39 (Activation) (None, 5, 217, 8) 0


max_pooling2d_30 (MaxPooling (None, 2, 108, 8) 0


activation_40 (Activation) (None, 2, 108, 8) 0


flatten_10 (Flatten) (None, 1728) 0


dropout_10 (Dropout) (None, 1728) 0


dense_10 (Dense) (None, 19316) 33397364

=================================================================

Total params: 33,400,492 Trainable params: 33,400,492 Non-trainable params: 0


Any suggestions?

Thanks a lot in advance!

def generator(data_arr, batch_size = 10):

num = len(data_arr) 

if num % batch_size != 0 : 
    num = int(num/batch_size)

# Loop forever so the generator never terminates
while True: 

for offset in range(0, num, batch_size):

    batch_samples = (data_arr[offset:offset+batch_size])

    samples = []
    labels = []

    for batch_sample in batch_samples:

        samples.append(batch_sample[0])
        labels.append((np.array(batch_sample[1].flatten)).transpose())

    X_ = np.array(samples)
    Y_ = np.array(labels)

    X_ = X_[:, :, :, newaxis]

    print(X_.shape)
    print(Y_.shape)

    yield (X_, Y_)

# compile and train the model using the generator function
train_generator = generator(training_data, batch_size = 10)
validation_generator = generator(val_data, batch_size = 10)

run_opts = tf.RunOptions(report_tensor_allocations_upon_oom = True)

model = Sequential()

model.add(Conv2D(32, (4, 4), strides=(2, 2), input_shape = (55, 1756, 
1)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size = (2, 2)))

model.add(Conv2D(16, (2, 2)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size = (2, 2)))

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

model.add(Activation('softmax'))
model.add(Flatten())  # this converts our 3D feature maps to 1D feature 
vectors
model.add(Dropout(0.3))
model.add(Dense(19316))

model.compile(loss = 'sparse_categorical_crossentropy',
              optimizer = 'adam',
              metrics = ['accuracy'],
              options = run_opts)

model.summary()

batch_size = 20
nb_epoch = 6

model.fit_generator(train_generator, 
                    steps_per_epoch = len(training_data) ,
                    epochs = nb_epoch,
                    validation_data = validation_generator,
                    validation_steps = len(val_data))
1

1 Answers

1
votes

You are currently using the sparse_categorical_crossentropy loss, which needs integer labels and does the one-hot encoding internally, but your labels are already one-hot encoded.

So for this case you should revert back to the categorical_crossentropy loss.