python - Conv2D ValueError:logits 和标签必须具有相同的形状((None,2)与(None,1))
问题描述
所以我正在尝试使用 CNN 类型使用 Tensorflow 制作 faceID,我只给我的数据提供了 15 张我的脸的图像(是一个简单的项目),我希望它预测它是我的脸还是不是我的脸,像真或假一样,问题是我不明白我的代码中的错误是什么。这是
ValueError: logits and labels must have the same shape ((None, 2) vs (None, 1))
这是我的代码
# 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 = 10
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(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')
解决方案
正如@Frightera 所述,替换:
model.add(Dense(classes))
通过model.add(Dense(1))
应该工作。
您的标签是一个整数,但您的最后一层输出一个二维数组。
推荐阅读
- javascript - 初始化时如何触发输入标签验证?
- symfony - Symfony 用户仅对一个请求保持身份验证
- jquery - jQuery get():如何通过结果显示主题循环
- excel - 通过 ODBC 连接使用 excel vba 进行 SQL 查询
- azure - 如何在使用 Azure AD 身份验证的 Jenkins 中读取队列状态?
- bash - 容器运行时如何使用 dockerfile 运行 .sh 文件
- angular - 在 Angular 8 中使用动态表单创建复选框
- javascript - 在没有 Gulp、Webpack 等的情况下转译、捆绑和缩小 JS - 仅限节点
- python - 有没有一种有效的方式来接收我的 python 应用程序的数据更新?
- spring - 通过 Spring CrudRepository 使用 Hibernate 保存大量数据