keras - 如何获得每个类的概率,而不是一个值为 1 和其他值为 0 的热编码数组?
问题描述
我的 Sequential CNN 模型作为多类分类器在 39 个类上进行了训练。至于预测,它返回一个单热编码数组,[0,0,...1,0,...]
而我想要类似的东西[0.012,0.022,0.067,...,0.997,0.0004,...]
有没有办法得到这个?如果不是,我到底应该做什么才能得到这些?
我想要这样的原因是为了验证其他类的接近程度,所以如果一个人说 0.98 而其他人说 0.96 那么我做错了什么,数据不够等等。
谢谢 :)
我的模型基本上是具有以下配置的 keras.model resnet50:
model = keras.applications.resnet.ResNet50(include_top=False, weights=None, input_tensor=None, input_shape=(64,64,1), pooling='avg', classes=39)
x = model.output
x = Dropout(0.7)(x)
num_classes = 39
predictions = Dense(num_classes, activation= 'softmax')(x)
model = Model(inputs = model.input, outputs = predictions)
optimizer = keras.optimizers.Adam(learning_rate=0.001, beta_1=0.9, beta_2=0.999, amsgrad=False)
model.compile(optimizer, loss='categorical_crossentropy', metrics=['categorical_accuracy'], loss_weights=None, sample_weight_mode=None, weighted_metrics=None, target_tensors=None)
样本输入:
import cv2
img = cv2.imread(IMAGE_PATH, 0)
img = cv2.resize(img, (64,64))
img = np.reshape(img, (1,64,64,1))
predicted_class_indices = np.argmax(model.predict(img, verbose = 1))
样本输出:
array([[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0.]], dtype=float32)
期望的输出(数字是假设的):
array([[0.022, 0.353, 0.0535, 0.52, 0212., 0.822, 0.532, 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0.]], dtype=float32)
解决方案
一种方法是删除最后一个激活层(相关问题)。
您可以使用model.layers[-1].activation=None
.
但是,softmax 不应该输出单热向量,而是概率分布,您可能需要检查您的训练情况。
推荐阅读
- java - 使用 ICEpdf 在 JavaFX 应用程序中查看 pdf 文件?
- python - 从已过滤的 Excel 文件写入 CSV
- python - 使用 Python 在 NetworkX 中示例边缘属性
- oauth-2.0 - Microsoft 访问令牌问题 invalid_grant 跟踪 ID 和相关 ID 问题
- c# - 在 C# 中的不同类型泛型列表中放置一个列表
- java - 如何从数组中的 PHP 页面获取 Java 请求响应
- python - Tensorboard 不显示所有训练数据
- amazon-web-services - AWS S3 存储复制功能
- excel - 访问条件格式单元格的颜色值(或识别条件格式单元格)
- spring-webflux - Spring 5 WebFlux 使用 WebSocket 的反应式服务器推送通知