Я делаю модель распознавания лиц, используя мою архитектуру на CNN, и обучаю ее распознавать 4 лица, но мне не удается достичь высокой validation_accuracy. Я даже пробовал Transfer Learning с использованием VGG16, но все равно получил максимальную точность проверки только 60%. Я использую в общей сложности 14300 изображений с 3575 изображениями, относящимися к каждому из 4 классов.
enter code here
import keras
import matplotlib.pyplot as plt
from numpy import set_printoptions
from keras import callbacks
from keras.callbacks import EarlyStopping
set_printoptions(precision=4,suppress=True)
classifier = keras.Sequential()
classifier.add(keras.layers.Convolution2D(16,kernel_size=(3,3),input_shape = (128,128,3),activation = 'relu',padding='same'))
classifier.add(keras.layers.Convolution2D(16,kernel_size=(3, 3),activation = 'relu'))
classifier.add(keras.layers.MaxPooling2D(pool_size = (2, 2),strides=2))
classifier.add(keras.layers.Dropout(0.4))
classifier.add(keras.layers.Convolution2D(32,kernel_size=(3, 3),activation = 'relu'))
classifier.add(keras.layers.Convolution2D(32,kernel_size=(3, 3),activation = 'relu'))
classifier.add(keras.layers.MaxPooling2D(pool_size = (2, 2),strides=2))
classifier.add(keras.layers.Dropout(0.4))
classifier.add(keras.layers.Convolution2D(64,kernel_size=(3, 3),activation = 'relu'))
classifier.add(keras.layers.Convolution2D(64,kernel_size=(3, 3),activation = 'relu'))
classifier.add(keras.layers.MaxPooling2D(pool_size = (2, 2),strides=2))
classifier.add(keras.layers.Dropout(0.4))
classifier.add(keras.layers.Flatten())
#classifier.add(keras.layers.Dropout(0.4))
classifier.add(keras.layers.Dense(128,activation = 'relu'))
classifier.add(keras.layers.Dropout(0.4))
classifier.add(keras.layers.Dense( 4, activation = 'softmax'))
from keras_preprocessing.image import ImageDataGenerator
train_datagen = ImageDataGenerator(rescale = 1./255,
width_shift_range=0.2,
height_shift_range=0.2,
rotation_range=40,
shear_range = 0.2,
zoom_range = [1.0,1.25],
fill_mode='nearest',
horizontal_flip = True,
brightness_range=[0.5,1.5])
training_set = train_datagen.flow_from_directory(r'/content/drive/My Drive/dataset2/Training_set',
target_size = (128, 128),
batch_size = 16,
class_mode = 'categorical',
shuffle=True)
test_datagen = ImageDataGenerator(rescale = 1./255)
test_set = test_datagen.flow_from_directory(r'/content/drive/My Drive/dataset2/Test_set',
target_size = (128, 128),
batch_size=2,
class_mode = 'categorical',
shuffle=True)
es=EarlyStopping(monitor='val_acc',patience=25,mode='max')
check_p=callbacks.ModelCheckpoint(filepath=r'Face_cnn_7{val_acc:.2f}.h5',monitor='val_acc',save_best_only=True)
call_b=[es,check_p]
history=classifier.fit_generator(training_set,
steps_per_epoch=895,
epochs =50,
validation_data = test_set,
validation_steps=100,
callbacks=call_b
)
# summarize history for accuracy
plt.plot(history.history['acc'])
plt.plot(history.history['val_acc'])
plt.title('model accuracy')
plt.ylabel('accuracy')
plt.xlabel('epoch')
plt.legend(['train', 'test'], loc='upper left')
plt.savefig("model accuracy.png")
plt.show()
# summarize history for loss
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('model loss')
plt.ylabel('loss')
plt.xlabel('epoch')
plt.legend(['train', 'test'], loc='upper left')
plt.savefig("model loss.png")
plt.show()
Я получаю мой val_a cc около 55%, а мой cc около 98%.