tensorflow/models · error · ValueError
'num_positives' was provided but it was a negative number.
Error message
'num_positives' was provided but it was a negative number.
What it means
Argument check in AveragePrecisionCalculator.accumulate: the optional num_positives override was supplied but is negative. num_positives lets callers account for true positives absent from the passed arrays; a negative count is nonsensical and would inflate precision, so it is rejected before any computation.
Solutions
- Pass num_positives >= 0, or omit it (None) to infer from actuals
- Check the upstream counting logic for a sign error or subtraction bug
- Coerce numpy scalars to int if a non-int numeric sneaks in from metrics code
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at official/projects/yt8m/eval_utils/average_precision_calculator.py:118 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of tensorflow/models@e006f5f0d5 (2026-08-24).
Data as JSON: /api/errors/3767f8918b3cdfea.
Report an issue: GitHub.
Appendix: source
Thrown at official/projects/yt8m/eval_utils/average_precision_calculator.py:118
Args:
predictions: a list storing the prediction scores.
actuals: a list storing the ground truth labels. Any value larger than 0
will be treated as positives, otherwise as negatives. num_positives = If
the 'predictions' and 'actuals' inputs aren't complete, then it's
possible some true positives were missed in them. In that case, you can
provide 'num_positives' in order to accurately track recall.
num_positives: number of positive examples.
Raises:
ValueError: An error occurred when the format of the input is not the
numpy 1-D array or the shape of predictions and actuals does not match.
"""
if len(predictions) != len(actuals):
raise ValueError("the shape of predictions and actuals does not match.")
if num_positives is not None:
if not isinstance(num_positives, numbers.Number) or num_positives < 0: # pyrefly: ignore[unsupported-operation]
raise ValueError(
"'num_positives' was provided but it was a negative number.")
if num_positives is not None:
self._total_positives += num_positives
else:
self._total_positives += numpy.size(
numpy.where(numpy.array(actuals) > 1e-5))
topk = self._top_n
heap = self._heap
for i in range(numpy.size(predictions)):
if topk is None or len(heap) < topk:
heapq.heappush(heap, (predictions[i], actuals[i]))
else:
if predictions[i] > heap[0][0]: # heap[0] is the smallest
heapq.heappop(heap)
heapq.heappush(heap, (predictions[i], actuals[i]))
View on GitHub (pinned to e006f5f0d5)