python - 我应该如何使用 cnn 提高人脸识别的准确性?
问题描述
from tensorflow.python.keras.applications.inception_v3 import preprocess_input
from tensorflow.python.keras.preprocessing.image import ImageDataGenerator
from tensorflow.python.keras.models import Sequential
from tensorflow.python.keras.layers import Dense, Flatten, Conv2D, MaxPool2D, Dropout
from keras.layers.normalization import BatchNormalization
from keras import regularizers
import os
os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
os.environ['CUDA_VISIBLE_DEVICES'] = '-1'
data_gen = ImageDataGenerator(preprocessing_function=preprocess_input, shear_range=0.2, zoom_range=0.2, horizontal_flip=True)
train_gen = data_gen.flow_from_directory('/home/bg22/PycharmProjects/KUNAL/dataset/training_set', target_size=(64,64), batch_size=16, class_mode='categorical')
test_gen = data_gen.flow_from_directory('/home/bg22/PycharmProjects/KUNAL/dataset/test_set', target_size=(64,64), batch_size=16, class_mode='categorical')
model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=(64, 64, 3)))
#model.add(BatchNormalization())
#model.add(Dropout(0.5))
model.add(MaxPool2D(pool_size=(2, 2)))
model.add(Conv2D(32, kernel_size=(3, 3), activation='relu'))
#model.add(BatchNormalization())
#model.add(Dropout(0.5))
model.add(MaxPool2D(pool_size=(2, 2)))
model.add(Conv2D(16, kernel_size=(3, 3), activation='relu'))
#model.add(BatchNormalization())
#model.add(Dropout(0.5))
model.add(MaxPool2D(pool_size=(2, 2)))
model.add(Conv2D(16, kernel_size=(3, 3), activation='relu'))
#model.add(BatchNormalization())
#model.add(Dropout(0.5))
model.add(MaxPool2D(pool_size=(2, 2)))
model.add(Flatten())
#model.add(Dense(16, activation='relu', kernel_regularizer=regularizers.l2(0.01)))
model.add(Dense(2, activation='softmax'))
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
model.fit_generator(train_gen, epochs= 10, validation_data=test_gen)
有了这个架构,我得到了 80% 的准确率。我尝试了这些方法来提高准确性:
- 批量标准化
- 权重衰减(L2 正则化器)
- 退出
但他们都没有给出预期的结果。
批量标准化给出错误:
/usr/bin/python3.5 "/home/bg22/PycharmProjects/KUNAL/Face Recognition.py"
Using TensorFlow backend.
Found 8000 images belonging to 2 classes.
Found 2000 images belonging to 2 classes.
Traceback (most recent call last):
File "/home/bg22/PycharmProjects/KUNAL/Face Recognition.py", line 20, in <module>
model.add(BatchNormalization())
File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/training/checkpointable/base.py", line 364, in _method_wrapper
method(self, *args, **kwargs)
File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/keras/engine/sequential.py", line 130, in add
'Found: ' + str(layer))
TypeError: The added layer must be an instance of class Layer. Found: keras.layers.normalization.BatchNormalization object at 0x7fddf526e9e8>
另一方面,Dropout 和正则化器反而降低了准确性!!
解决方案
首先,您从 keras.layers.BatchNormalization 导入 BatchNormalization 层。您可以采取以下措施来提高准确性。
- 减小批量大小。
- 将学习率降低到较小的数字,例如 0.001 或 0.0001。
- 将辍学率略微提高到 0.5 或 0.6。
- 使用 alpha(负斜率)0.2 或 0.01 的 LeakyReLU 激活。
- 尝试使用 AdaGrad 或 Nadam 优化器。
- 添加两个 Conv2d 层,然后添加池化层。
推荐阅读
- linux - 将stderr和stdout重定向到Bash中的文件的不同方法?
- python - 如何在pygame中平台的所有4个侧面进行碰撞?
- python - SQLAlchemy:关系集合延迟加载
- python - 为什么我的程序没有检测到大写字符?
- javascript - 如何在不更改 div 中的任何其他元素的情况下更改 div 内的文本
- c# - 回词与新添加的成员兼容
- java - TCP客户端消息累积
- javascript - 如何使用 Promise 为函数编写单元测试
- typescript - 为什么这个映射类型会移除 `?` 装饰器?我们如何在不删除它的情况下获得类似的结果?
- python - 如何在条件满足之前用 N 行中的一些对条件行进行子集化,比我的代码更快?