-2

我创建了一个神经网络,它将人的图像作为 X_training 值,将他们各自的性别(二进制值)作为 Y_train 值,我的目标是在用户输入图像后预测相关性别。这是我将图像和性别值设置为训练数据的代码:

from sklearn.model_selection import train_test_split

images_f=np.array(images)
images_f_2=images_f/255

labels_f=np.array(genders)

标签_f:

array([1, 0, 1, ..., 0, 0, 0])

我基本上使用卷积层,因为我预测的是二进制值(男性或女性,0 或 1),所以我使用 sigmoid 作为我最终的密集层激活方法。

这是模型代码:

# Create a model and add layers
model = Sequential()

model.add(Conv2D(32, (3, 3), padding='same', input_shape=(48, 48, 3),strides=(1, 1),kernel_regularizer=l2(0.001), activation="relu"))
model.add(Conv2D(32, (3, 3), activation="relu"))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Conv2D(64, (3, 3), padding='same', activation="relu"))
model.add(Conv2D(64, (3, 3), activation="relu"))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Conv2D(128, (3, 3), padding='same', activation="relu"))
model.add(Conv2D(128, (3, 3), activation="relu"))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Flatten())
model.add(Dense(512, activation="relu"))
model.add(Dropout(0.5))
model.add(Dense(1, activation="sigmoid"))

model.summary()

model.compile(
    loss='binary_crossentropy',
    optimizer='adam',
    metrics=['accuracy']
)

这是我适合值代码的地方:

# Train the model
model.fit(
    X_train,
    [Y_train],
    batch_size=64,
    epochs=30,
    validation_data=(X_test, Y_test),
    shuffle=True
)

现在,一旦我训练了模型,我就尝试调用模型并设置我自己的一张图像并进行预测。

from keras.preprocessing import image

img = image.load_img("queen.jpg", target_size=(48, 48,3))

# Convert the image to a numpy array
img = image.img_to_array(img)
# Add a forth dimension to the image (since Keras expects a bunch of images, not a single image)
img/=255
img = np.expand_dims(img, axis=0)


result = model.predict(img)

我得到它的结果值:

array([[0.06528784]], dtype=float32)

对于每一个图像,我得到一个浮点值,但我期望一个二进制值。为什么?

4

1 回答 1

-1

我试过这样:

print((model.predict_classes(img)))

于 2021-01-11T09:33:51.357 回答