Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python NN-尝试创建人脸分类(不同人脸之间的差异),但结果不佳_Python_Tensorflow_Image Processing_Neural Network_Face Recognition - Fatal编程技术网

Python NN-尝试创建人脸分类(不同人脸之间的差异),但结果不佳

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

我正在尝试创建一个神经网络,它将获得两张或更多的人物脸、人物脸等。。。并将识别每个人脸的姓名

例如,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('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输入形状,您的神经元非常小)

我认为你应该考虑添加更多的代码<代码> VAR2D2/代码>层来进行有效的特征提取。try@ShubhamPanchal哇,我做到了,从25%提高到了63%。多亏了阿洛特·博伊,我要试试《时代》,但是你能看看我的EDIT2,看看这是不是你的意思吗?顺便说一下,我只做了1个历元,因为在第一个历元之后,100%AccuCarry上的拟合堆栈。如果你在训练集上有100%的数据,而在测试集上没有,你应该使用训练和验证集。在
fit()
中,包括
validation\u split=.2
,您将更好地了解您的实际模型性能。如果列车组上有100%,但测试组上有75%,则说明您安装过度