有没有办法只保存 Keras 中 softmax 预测中的最大概率?

问题描述

我正在使用 tensorflowkeras 来构建神经网络。问题是我有 40k 个类别和 1M 个分类问题的条目,当我尝试使用 softmax 预测每个类别的所有概率时,出现内存错误(我认为这是因为它无法保存如此大的数组1M x 40k)。

但是,对我来说,例如知道数据集中每个主题的三个最可能的类别就足够了。这可以大大减少阵列的大小(1M x 3)。那么有没有办法只得到Keras预测中最可能的三个类别呢?或者我必须强制保存每个类别的所有概率?

谢谢大家!

解决方法

您应该尝试向您的预测函数添加自定义回调。下面的代码 从每个批次(从自动创建的日志中)获取预测,并允许您对它们执行操作。

您需要先获取前 N 个分数的索引,而不仅仅是按分数排序,以便您能够将 one-hot 编码转换回原始标签,但这超出了范围这个问题。如果您使用的是 labelencoder,您可以:

  • 在回调中执行 inverse_transform 以获取实际标签
  • 然后将它们与乐谱一起压缩
  • 然后按元组内的分数排序
  • 然后提取前 N 个标签

一旦找到了合适的算法来排序和获取索引或标签,您就可以将结果扩展到外部列表(extend,因为您想将每个单独的批次添加为一组分离的列表,而不仅仅是每批添加一个额外元素(如 append 会发生的情况)),然后将其加入到原始测试集。

del logs 最后会清除内存中的所有预测,然后继续下一批。

top2_predictions=[]

class CustomCallback(keras.callbacks.Callback):
    def on_predict_batch_end(self,batch,logs=None):

        preds = logs['outputs']

        <insert indices sorting code,maybe np.argpartition>

        top2 = preds[:,:2]

        top2_predictions.extend(top2)

        del logs


model.predict(test_dataset,callbacks=[CustomCallback()])