我的模型 (CNN) 预测一切都一样
My model (CNN) predicts the same for everything
祝大家度过愉快的一天。我一直在研究用作 FaceID 的 CNN 类型模型,我的数据只是我的照片,该模型没有错误,但是当我预测它总是给我相同的输出时(它说每个都是 100% face, even is not me), 我认为是Y值,但我不确定。我想要的是输出是我还是其他。这是我的代码
# Face ID project, using CNN tensorflow
from tensorflow.keras.preprocessing.image import img_to_array
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D, BatchNormalization, Activation
from tensorflow.keras import backend as K
import numpy as np
import cv2
import glob
# Preparing the data and parameters
epochs = 100
lr = 1e-3
batch_size = 64
img_dims = (96,96,3)
data = []
labels = []
image_files = glob.glob("C:/Users/berna/Desktop/Programming/AI_ML_DL/Projects/FaceID/Data/*")
for img in image_files:
image = cv2.imread(img)
image = cv2.resize(image, (img_dims[0], img_dims[1]))
image = img_to_array(image)
data.append(image)
if img == img:
label = 1
else:
label = 0
labels.append([label])
# Preproccesing the data (convert arrays)
data = np.array(data, dtype="float32") / 255.0
labels = np.array(labels)
X = data
y = labels
def build(width, height, depth, classes):
model = Sequential()
inputShape = height, width, depth
chanDim = -1
if K.image_data_format() == "channels_first":
inputShape = depth, height, width
chanDim = 1
# Creating the model
model.add(Conv2D(32, (3,3), padding="same", input_shape=inputShape))
model.add(Activation("relu"))
model.add(BatchNormalization(axis=chanDim))
model.add(MaxPooling2D(pool_size=(3,3)))
model.add(Dropout(0.25))
model.add(Conv2D(64, (3,3), padding="same"))
model.add(Activation("relu"))
model.add(BatchNormalization(axis=chanDim))
model.add(Conv2D(64, (3,3), padding="same"))
model.add(Activation("relu"))
model.add(BatchNormalization(axis=chanDim))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.25))
model.add(Conv2D(128, (3,3), padding="same"))
model.add(Activation("relu"))
model.add(BatchNormalization(axis=chanDim))
model.add(Conv2D(128, (3,3), padding="same"))
model.add(Activation("relu"))
model.add(BatchNormalization(axis=chanDim))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(1024))
model.add(Activation("relu"))
model.add(BatchNormalization())
model.add(Dropout(0.5))
model.add(Dense(1))
model.add(Activation("sigmoid"))
return model
# Build the model call
model = build(width=img_dims[0], height=img_dims[1], depth=img_dims[2], classes=1)
# compile the model
opt = Adam(lr=lr, decay=lr/epochs)
model.compile(loss="binary_crossentropy",
optimizer=opt,
metrics=['accuracy'])
# fitting the model
H = model.fit(X, y, batch_size=batch_size,
epochs=epochs, verbose=1)
model.save('faceid.model')
知道发生了什么吗?
编辑
Si修改了我的代码和数据集,现在其他= 1和我= 0但是在预测的那一刻,它仍然只预测一个这里是我的代码
# Face ID project, using CNN tensorflow
from tensorflow.keras.preprocessing.image import img_to_array
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.models import Sequential
from tensorflow.keras.utils import to_categorical
from tensorflow.keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D, BatchNormalization, Activation
from tensorflow.keras import backend as K
import numpy as np
import random
import cv2
import glob
import os
# Preparing the data and parameters
epochs = 100
lr = 1e-3
batch_size = 64
img_dims = (96,96,3)
data = []
labels = []
image_files = [f for f in glob.glob("C:/Users/berna/Desktop/Programming/AI_ML_DL/Projects/FaceID/Data"+"/**/*", recursive=True) if not os.path.isdir(f)]
random.shuffle(image_files)
for img in image_files:
image = cv2.imread(img)
image = cv2.resize(image, (img_dims[0], img_dims[1]))
image = img_to_array(image)
data.append(image)
label = img.split(os.path.sep)[-2]
if label == "Other":
label = 1
else:
label = 0
labels.append([label])
# Preproccesing the data (convert arrays)
data = np.array(data, dtype="float32") / 255.0
labels = np.array(labels)
X = data
y = to_categorical(labels, num_classes=2)
def build(width, height, depth, classes):
model = Sequential()
inputShape = height, width, depth
chanDim = -1
if K.image_data_format() == "channels_first":
inputShape = depth, height, width
chanDim = 1
# Creating the model
model.add(Conv2D(32, (3,3), padding="same", input_shape=inputShape))
model.add(Activation("relu"))
model.add(BatchNormalization(axis=chanDim))
model.add(MaxPooling2D(pool_size=(3,3)))
model.add(Dropout(0.25))
model.add(Conv2D(64, (3,3), padding="same"))
model.add(Activation("relu"))
model.add(BatchNormalization(axis=chanDim))
model.add(Conv2D(64, (3,3), padding="same"))
model.add(Activation("relu"))
model.add(BatchNormalization(axis=chanDim))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.25))
model.add(Conv2D(128, (3,3), padding="same"))
model.add(Activation("relu"))
model.add(BatchNormalization(axis=chanDim))
model.add(Conv2D(128, (3,3), padding="same"))
model.add(Activation("relu"))
model.add(BatchNormalization(axis=chanDim))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(1024))
model.add(Activation("relu"))
model.add(BatchNormalization())
model.add(Dropout(0.5))
model.add(Dense(classes))
model.add(Activation("sigmoid"))
return model
# Build the model call
model = build(width=img_dims[0], height=img_dims[1], depth=img_dims[2], classes=2)
# compile the model
opt = Adam(lr=lr, decay=lr/epochs)
model.compile(loss="binary_crossentropy",
optimizer=opt,
metrics=['accuracy'])
# fitting the model
H = model.fit(X, y, batch_size=batch_size,
epochs=epochs, verbose=1)
model.save('faceid.model')
答案就在你的问题里面。你说你的数据只是你的照片。这意味着您使用具有相同标签 y = 1
的照片训练了模型。因此,模型将始终预测 y = 1
是合乎逻辑的。如果你想让模型区分你的照片和其他人的照片,你必须同时使用你的照片和其他人的照片来训练模型,并为你的照片设置y = 1
,并且y = 0
其他人的照片。
注意:在您的代码中,此 if 条件始终 returns true:
if img == img:
label = 1
因为img等于它自己,所以label总是=1。
祝大家度过愉快的一天。我一直在研究用作 FaceID 的 CNN 类型模型,我的数据只是我的照片,该模型没有错误,但是当我预测它总是给我相同的输出时(它说每个都是 100% face, even is not me), 我认为是Y值,但我不确定。我想要的是输出是我还是其他。这是我的代码
# Face ID project, using CNN tensorflow
from tensorflow.keras.preprocessing.image import img_to_array
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D, BatchNormalization, Activation
from tensorflow.keras import backend as K
import numpy as np
import cv2
import glob
# Preparing the data and parameters
epochs = 100
lr = 1e-3
batch_size = 64
img_dims = (96,96,3)
data = []
labels = []
image_files = glob.glob("C:/Users/berna/Desktop/Programming/AI_ML_DL/Projects/FaceID/Data/*")
for img in image_files:
image = cv2.imread(img)
image = cv2.resize(image, (img_dims[0], img_dims[1]))
image = img_to_array(image)
data.append(image)
if img == img:
label = 1
else:
label = 0
labels.append([label])
# Preproccesing the data (convert arrays)
data = np.array(data, dtype="float32") / 255.0
labels = np.array(labels)
X = data
y = labels
def build(width, height, depth, classes):
model = Sequential()
inputShape = height, width, depth
chanDim = -1
if K.image_data_format() == "channels_first":
inputShape = depth, height, width
chanDim = 1
# Creating the model
model.add(Conv2D(32, (3,3), padding="same", input_shape=inputShape))
model.add(Activation("relu"))
model.add(BatchNormalization(axis=chanDim))
model.add(MaxPooling2D(pool_size=(3,3)))
model.add(Dropout(0.25))
model.add(Conv2D(64, (3,3), padding="same"))
model.add(Activation("relu"))
model.add(BatchNormalization(axis=chanDim))
model.add(Conv2D(64, (3,3), padding="same"))
model.add(Activation("relu"))
model.add(BatchNormalization(axis=chanDim))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.25))
model.add(Conv2D(128, (3,3), padding="same"))
model.add(Activation("relu"))
model.add(BatchNormalization(axis=chanDim))
model.add(Conv2D(128, (3,3), padding="same"))
model.add(Activation("relu"))
model.add(BatchNormalization(axis=chanDim))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(1024))
model.add(Activation("relu"))
model.add(BatchNormalization())
model.add(Dropout(0.5))
model.add(Dense(1))
model.add(Activation("sigmoid"))
return model
# Build the model call
model = build(width=img_dims[0], height=img_dims[1], depth=img_dims[2], classes=1)
# compile the model
opt = Adam(lr=lr, decay=lr/epochs)
model.compile(loss="binary_crossentropy",
optimizer=opt,
metrics=['accuracy'])
# fitting the model
H = model.fit(X, y, batch_size=batch_size,
epochs=epochs, verbose=1)
model.save('faceid.model')
知道发生了什么吗?
编辑 Si修改了我的代码和数据集,现在其他= 1和我= 0但是在预测的那一刻,它仍然只预测一个这里是我的代码
# Face ID project, using CNN tensorflow
from tensorflow.keras.preprocessing.image import img_to_array
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.models import Sequential
from tensorflow.keras.utils import to_categorical
from tensorflow.keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D, BatchNormalization, Activation
from tensorflow.keras import backend as K
import numpy as np
import random
import cv2
import glob
import os
# Preparing the data and parameters
epochs = 100
lr = 1e-3
batch_size = 64
img_dims = (96,96,3)
data = []
labels = []
image_files = [f for f in glob.glob("C:/Users/berna/Desktop/Programming/AI_ML_DL/Projects/FaceID/Data"+"/**/*", recursive=True) if not os.path.isdir(f)]
random.shuffle(image_files)
for img in image_files:
image = cv2.imread(img)
image = cv2.resize(image, (img_dims[0], img_dims[1]))
image = img_to_array(image)
data.append(image)
label = img.split(os.path.sep)[-2]
if label == "Other":
label = 1
else:
label = 0
labels.append([label])
# Preproccesing the data (convert arrays)
data = np.array(data, dtype="float32") / 255.0
labels = np.array(labels)
X = data
y = to_categorical(labels, num_classes=2)
def build(width, height, depth, classes):
model = Sequential()
inputShape = height, width, depth
chanDim = -1
if K.image_data_format() == "channels_first":
inputShape = depth, height, width
chanDim = 1
# Creating the model
model.add(Conv2D(32, (3,3), padding="same", input_shape=inputShape))
model.add(Activation("relu"))
model.add(BatchNormalization(axis=chanDim))
model.add(MaxPooling2D(pool_size=(3,3)))
model.add(Dropout(0.25))
model.add(Conv2D(64, (3,3), padding="same"))
model.add(Activation("relu"))
model.add(BatchNormalization(axis=chanDim))
model.add(Conv2D(64, (3,3), padding="same"))
model.add(Activation("relu"))
model.add(BatchNormalization(axis=chanDim))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.25))
model.add(Conv2D(128, (3,3), padding="same"))
model.add(Activation("relu"))
model.add(BatchNormalization(axis=chanDim))
model.add(Conv2D(128, (3,3), padding="same"))
model.add(Activation("relu"))
model.add(BatchNormalization(axis=chanDim))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(1024))
model.add(Activation("relu"))
model.add(BatchNormalization())
model.add(Dropout(0.5))
model.add(Dense(classes))
model.add(Activation("sigmoid"))
return model
# Build the model call
model = build(width=img_dims[0], height=img_dims[1], depth=img_dims[2], classes=2)
# compile the model
opt = Adam(lr=lr, decay=lr/epochs)
model.compile(loss="binary_crossentropy",
optimizer=opt,
metrics=['accuracy'])
# fitting the model
H = model.fit(X, y, batch_size=batch_size,
epochs=epochs, verbose=1)
model.save('faceid.model')
答案就在你的问题里面。你说你的数据只是你的照片。这意味着您使用具有相同标签 y = 1
的照片训练了模型。因此,模型将始终预测 y = 1
是合乎逻辑的。如果你想让模型区分你的照片和其他人的照片,你必须同时使用你的照片和其他人的照片来训练模型,并为你的照片设置y = 1
,并且y = 0
其他人的照片。
注意:在您的代码中,此 if 条件始终 returns true:
if img == img:
label = 1
因为img等于它自己,所以label总是=1。