Не получается высокая точность validation_accuracy, несмотря на высокую точность набора поездов - PullRequest
0 голосов
/ 11 марта 2020

Я делаю модель распознавания лиц, используя мою архитектуру на 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%.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...