python - 加快不确定性计算
问题描述
我想为主动学习目的计算蒙特卡洛辍学的不确定性分数。
我对同一图像有 T 个预测,目前我正在使用以下函数计算每个像素的预测的熵。如果预测的类别不同(例如,对于 T = 3: [1, 2, 3]),该函数应该返回一个较高的值,而当类别相等时(例如 [1, 1, 1]),该函数应该返回一个较低的值
def calculate_entropy(labels, base=e):
value,counts = np.unique(labels, return_counts=True)
norm_counts = counts / counts.sum()
return -(norm_counts * np.log(norm_counts)/np.log(base)).sum()
我的预测结果是这样的数组形状:[T, Height, Width]
输出形状为[Height, Width]
. 因为我想要每一行的熵,所以我这样调用函数: np.apply_along_axis(func1d=calculate_entropy, axis=1, arr=data)
对于具有多个预测的一张图像,该功能需要 3 秒,这太高了。有人建议如何改进吗?
示例输入:
preds = np.array([
[[0, 2, 0],
[1, 1, 0]],
[[0, 2, 9],
[1, 2, 9]],
[[1, 1, 0],
[2, 2, 9]],
[[1, 1, 9],
[3, 2, 9]],
])
示例输出:
[[0.69314718 0.69314718 0.69314718]
[1.03972077 0.56233514 0.56233514]]
解决方案
推荐阅读
- javascript - 表单范围的点击事件:每个输入字段都有完全相同的点击事件
- apache - 2个网络服务器的服务器设置
- java - Java:如何传递对新运算符的引用?
- c - 在用户输入的 ID 号前加上“0”
- javascript - 如何告诉父类元素在 ReactJS 中发生了变化?
- mysql - 如何仅在包含更改时才使用触发器在历史表中添加数据
- elixir - Ecto/Phoenix 上的多态性与在 Rails 上创建的数据库
- google-bigquery - 用于射击图的 Bigquery GIS
- javascript - 按出现的元素频率对数组进行排序
- neo4j - 有没有办法可以根据不同的条件从 neo4j 数据库中获取数据