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.