Python NN-尝试创建人脸分类(不同人脸之间的差异),但结果不佳
我正在尝试创建一个神经网络,它将获得两张或更多的人物脸、人物脸等。。。并将识别每个人脸的姓名 例如,NN获取这些图片: NN会说-1是谢尔顿,2是莱纳德 所以我做了以下代码-Python NN-尝试创建人脸分类(不同人脸之间的差异),但结果不佳,python,tensorflow,image-processing,neural-network,face-recognition,Python,Tensorflow,Image Processing,Neural Network,Face Recognition,我正在尝试创建一个神经网络,它将获得两张或更多的人物脸、人物脸等。。。并将识别每个人脸的姓名 例如,NN获取这些图片: NN会说-1是谢尔顿,2是莱纳德 所以我做了以下代码- import numpy as np import tensorflow as tf from pathlib import Path import cv2 from random import shuffle X = [] Y = [] NAMES = { } i = 0 for filename in Path
import numpy as np
import tensorflow as tf
from pathlib import Path
import cv2
from random import shuffle
X = []
Y = []
NAMES = {
}
i = 0
for filename in Path('data').rglob('*.jpg'):
i += 1
img = cv2.imread(str(filename), cv2.IMREAD_UNCHANGED)
resized = cv2.resize(img, (150, 150), interpolation=cv2.INTER_AREA)
X.append(np.asarray(resized))
thisName = str(filename).split("_")[0].split("\\")[1]
if i == 1:
NAMES[thisName] = 0
if thisName in NAMES.keys():
Y.append(np.asarray(NAMES[thisName]))
else:
print(NAMES.values())
NAMES[thisName] = max(NAMES.values()) + 1
Y.append(np.asarray(NAMES[thisName]))
Z = list(zip(X, Y))
shuffle(Z) # WE SHUFFLE X,Y TO PERFORM RANDOM ON THE TEST LEVEL
X, Y = zip(*Z)
X = np.asarray(X)
Y = np.asarray(Y)
model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(16, (3, 3), activation='relu', input_shape=(150, 150, 3)),
tf.keras.layers.MaxPooling2D(2, 2),
tf.keras.layers.Conv2D(32, (3, 3), activation='relu'),
tf.keras.layers.MaxPooling2D(2, 2),
tf.keras.layers.Conv2D(64, (3, 3), activation='relu'),
tf.keras.layers.MaxPooling2D(2, 2),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(1024, activation='relu'),
tf.keras.layers.Dense(7, activation='softmax', name='pred')
])
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
# -------------- OUR TENSOR FLOW NEURAL NETWORK MODEL -------------- #
print("fitting")
history = model.fit(X, Y, epochs=1, batch_size=20)
print("testing")
model.evaluate(X, Y)
(模型前面的行只是从数据集中拍摄一张照片,并给她一个自定义图片名称的数字,假设这是一张sheldon的照片,而她将其作为输出0和输入图像本身……)
我拿了这个:在我装配模型之后,我在上面测试了模型,但不幸的是,我没有得到90%的预期结果,而是只得到了25%
我做错什么了吗
非常感谢,对不起我的英语
编辑:我的数据集看起来很好,除了penny的照片(但它不会影响太多)
编辑2:在我添加了一些conv2d之后,我得到了75%而不是25%,我仍然想要更多,但绝对更好
这是我的新型号:
model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(64, (3, 3), activation='relu', input_shape=(150, 150, 3)),
tf.keras.layers.MaxPooling2D(2, 2),
tf.keras.layers.Conv2D(128, (3, 3), activation='relu'),
tf.keras.layers.MaxPooling2D(2, 2),
tf.keras.layers.Conv2D(256, (3, 3), activation='relu'),
tf.keras.layers.MaxPooling2D(2, 2),
tf.keras.layers.Conv2D(512, (3, 3), activation='relu'),
tf.keras.layers.MaxPooling2D(2, 2),
tf.keras.layers.Conv2D(1024, (3, 3), activation='relu'),
tf.keras.layers.MaxPooling2D(2, 2),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(2048, activation='relu'),
tf.keras.layers.Dense(7, activation='softmax', name='pred')
])
我在您的代码中看到的唯一明显缺陷是您只运行了一个时代。将
epochs
设置为10、20或您有足够耐心的任何数量
可能有帮助的事情:
- 制作更深的网络(添加更多层)
- 增加神经元的数量(对于150x150x3输入形状,您的神经元非常小)
fit()
中,包括validation\u split=.2
,您将更好地了解您的实际模型性能。如果列车组上有100%,但测试组上有75%,则说明您安装过度