简体   繁体   中英

ValueError: Error when checking target: expected activation_6 to have shape (70,) but got array with shape (71,)

I am creating face recognition using CNN. I was following a tutorial. I am using Tensorflow==1.15.

The programme will take 70 snaps of the user's face and save them in the folder 'dataset'

I keep getting the error:

ValueError: Error when checking target: expected activation_6 to have shape (70,) but got array with shape (71,)

input shapes - (32,32,1)

classes(n_classes) - 70


K.clear_session()
n_faces = len(set(ids))

model = model((32,32,1),n_faces) #Calling Model given in next code block
faces = np.asarray(faces)
faces = np.array([downsample_image(ab) for ab in faces])
ids = np.asarray(ids)
faces = faces[:,:,:,np.newaxis]
print("Shape of Data: " + str(faces.shape))
print("Number of unique faces : " + str(n_faces))


ids = to_categorical(ids)

faces = faces.astype('float32')
faces /= 255.


x_train, x_test, y_train, y_test = train_test_split(faces,ids, test_size = 0.2, random_state = 0)

print(x_train.shape)
print(y_train.shape)
print(x_test.shape)
print(y_test.shape)

checkpoint = callbacks.ModelCheckpoint('trained_model.h5', monitor='val_acc',
                                           save_best_only=True, save_weights_only=True, verbose=1)
                                    
model.fit(x_train, y_train,
             batch_size=32,
             epochs=10,
             validation_data=(x_test, y_test),
             shuffle=True,callbacks=[checkpoint])


def model(input_shape,num_classes):    

    model = Sequential()

    model.add(Conv2D(32, (3, 3), input_shape=input_shape))
    model.add(Activation("relu"))

    model.add(Conv2D(64, (3, 3)))
    model.add(BatchNormalization())
    model.add(Activation("relu"))

    model.add(Conv2D(64, (1, 1)))
    model.add(Dropout(0.5))
    model.add(BatchNormalization())
    model.add(Activation("relu"))

    model.add(Conv2D(128, (3, 3)))
    model.add(Dropout(0.5))
    model.add(Activation("relu"))

    model.add(MaxPooling2D(pool_size=(2,2)))

    model.add(Conv2D(64, (1, 1)))
    model.add(Activation("relu"))

    model.add(Flatten())
    model.add(Dense(32))
    model.add(Dense(num_classes))
    model.add(Activation("softmax"))
    
    model.compile(loss='categorical_crossentropy',
              optimizer='sgd',
              metrics=['accuracy'])

    model.summary()
    return model

Output







Model: "sequential_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_1 (Conv2D)            (None, 30, 30, 32)        320       
_________________________________________________________________
activation_1 (Activation)    (None, 30, 30, 32)        0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 28, 28, 64)        18496     
_________________________________________________________________
batch_normalization_1 (Batch (None, 28, 28, 64)        256       
_________________________________________________________________
activation_2 (Activation)    (None, 28, 28, 64)        0         
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 28, 28, 64)        4160      
_________________________________________________________________
dropout_1 (Dropout)          (None, 28, 28, 64)        0         
_________________________________________________________________
batch_normalization_2 (Batch (None, 28, 28, 64)        256       
_________________________________________________________________
activation_3 (Activation)    (None, 28, 28, 64)        0         
_________________________________________________________________
conv2d_4 (Conv2D)            (None, 26, 26, 128)       73856     
_________________________________________________________________
dropout_2 (Dropout)          (None, 26, 26, 128)       0         
_________________________________________________________________
activation_4 (Activation)    (None, 26, 26, 128)       0         
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 13, 13, 128)       0         
_________________________________________________________________
conv2d_5 (Conv2D)            (None, 13, 13, 64)        8256      
_________________________________________________________________
activation_5 (Activation)    (None, 13, 13, 64)        0         
_________________________________________________________________
flatten_1 (Flatten)          (None, 10816)             0         
_________________________________________________________________
dense_1 (Dense)              (None, 32)                346144    
_________________________________________________________________
dense_2 (Dense)              (None, 70)                2310      
_________________________________________________________________
activation_6 (Activation)    (None, 70)                0         
=================================================================
Total params: 454,054
Trainable params: 453,798
Non-trainable params: 256
_________________________________________________________________
Shape of Data: (70, 32, 32, 1)
Number of unique faces : 70

I am calculating x_train, x_test, y_train, y_test as shown below

x_train, x_test, y_train, y_test = train_test_split(faces,ids, test_size = 0.2, random_state = 0)

Output

x_train - (56, 32, 32, 1)

y_train - (56, 71)

x_test - (14, 32, 32, 1)

y_test - (14, 71)

What I am doing wrong with the dimensions of CNN layers? Please Help

In your model.summary() output, you see that your final dense layer has shape (None, 70). None stands for your batch size, which is currently not known. 70 then is the dimensionality of the output for each of your images.

From your y_train and y_pred, it seems like you want to output 71 classes, not 70, and thus the dimensions do not match. You can try to change your last dense layer to

model.add(Dense(num_classes+1))

This should work. I do not know the reason why your y values do not have the same length as your number of classes. One reason could be, that there is one class for "nothing", so the class that is supposed to be selected in no other class is correct. This could explain why you need a 71-dimensional output if you have 70 classes.

I am suspecting that ids has the shape (row, col) of (70,71) - where 70 being the number of instances and 71 being the softmax vector for class. (I got this by adding x_train.shape[0]=56 and x_test.shape[0]=14)

In this line n_faces = len(set(ids)) , the set method is checking for unique lists (softmax vector of each class), then len method gives you the number of instances which is 70.

In train_test_split , the y parameter is the entire ids , hence it splits along the row (70 instances) while retain the softmax vector of each instance (71 dimension vector).

This could explain why your model has 70 dimension output while you actually need 71 dimension output.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM