gpt4 book ai didi

python - 如何解释 model.predict 返回的结果?

转载 作者:行者123 更新时间:2023-12-05 02:54:51 25 4
gpt4 key购买 nike

我正在尝试制作一个可以识别图片中是否有猫的神经网络。我找到了 this tutorial在 tensorflow 网站上并尝试使其适应我的问题。本教程用于分类猫和狗,但由于我只想检测猫,所以我将类别更改为猫和非猫。

对于非猫,我下载了一个随机图像数据集。

我在教程中的代码中添加了两个生成器:

test_data_gen = test_image_generator.flow_from_directory(batch_size=batch_size,
directory=test_dir,
target_size=(IMG_HEIGHT, IMG_WIDTH),
class_mode='binary')

pred_data_gen = pred_image_generator.flow_from_directory(batch_size=batch_size,
directory=pred_dir,
target_size=(IMG_HEIGHT, IMG_WIDTH),
class_mode='binary')

然后像这样测试模型:

print('\n# Evaluate on test data')
results = model.evaluate_generator(test_data_gen)
print('test loss, test acc:', results)

print('\n# Generate predictions')
predictions = model.predict(pred_data_gen)
print(len(predictions))
print(predictions)

这是输出:

# Evaluate on test data
test loss, test acc: [0.45212748232815003, 0.9324082]
# Generate predictions for custom samples
256
[[ -8.023465 ]
[ -7.781438 ]
[ 50.281197 ]
[-10.172492 ]
[ -5.1096087 ]
[ 43.0299 ]
[ 21.416649 ]
...
[-10.866359 ]
[-14.797473 ]
[ 84.72212 ]
[ 23.712345 ]
[ -6.4916744 ]
[-18.384903 ]
[ 33.10642 ]]

测试准确率很高,但我不知道这些结果是什么意思。我认为它们应该在 0 和 1 之间,但它们甚至有负值。我应该如何解释这些结果?

编辑:

这是我的模型(在最后一层添加 sigmoid 激活函数之前):

model = Sequential([
Conv2D(16, 3, padding='same', activation='relu', input_shape=(IMG_HEIGHT, IMG_WIDTH, 3)),
MaxPooling2D(),
Conv2D(32, 3, padding='same', activation='relu'),
MaxPooling2D(),
Conv2D(64, 3, padding='same', activation='relu'),
MaxPooling2D(),
Flatten(),
Dense(512, activation='relu'),
Dense(1)
])

我将最后一层更改为 Dense(1, activation='sigmoid'),输出如下所示:

# Evaluate on test data
test loss, test acc: [0.714477022488912, 0.5949367]

# Generate predictions for custom samples
256
[[1.]
[1.]
[1.]
...
[1.]
[1.]
[1.]]

所有预测值都是 1,即使在测试集中只有一半的图像是猫。

编辑2:

以下是我如何编译和拟合模型:

model.compile(optimizer='adam',
loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),
metrics=['accuracy'])

model.summary()

history = model.fit_generator(
train_data_gen,
steps_per_epoch=total_train // batch_size,
epochs=epochs,
validation_data=val_data_gen,
validation_steps=total_val // batch_size
)

最佳答案

模型中的最后一层是具有单个神经元的 Dense 层。由于未向其传递任何参数,因此默认情况下它具有线性激活。用户@Code Pope 表示这是一个“失败”(Tensorflow 文档中的错误?)。不是,代码完全没问题。

你的损失函数计算二元交叉熵,它可以很容易地与线性激活一起工作。事实上,计算 sigmoid 只是一些额外的东西,并不需要。人工神经网络将为一类输出负值,为另一类输出正值。它们没有标准化,而是所谓的 logits - 这就是为什么你在损失函数中说 from_logits=True

如何获得预测:

from sklearn.metrics import accuracy_score

images, actual = next(train_data_gen)
predictions = model.predict(images)
predictions = (predictions > 0).flatten()
accuracy_score(results, pred)

关于python - 如何解释 model.predict 返回的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61556903/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com