// losses.mbt
///|
/// Cross entropy for a two-dimensional logits tensor and integer class labels.
pub fn cross_entropy(logits : Tensor, labels : Tensor) -> Tensor {
if logits.shape.length() != 2 || labels.shape.length() != 1 {
panic()
}
let batch = logits.shape[0]
let classes = logits.shape[1]
if batch == 0 ||
classes == 0 ||
labels.shape[0] != batch ||
labels.data.length() != batch {
panic()
}
for label in labels.data {
if label < 0.0 ||
label >= classes.to_double() ||
label != label.to_int().to_double() {
panic()
}
}
let mut total = 0.0
for row in 0.. maximum {
maximum = logits.data[offset + col]
}
}
let mut denominator = 0.0
for col in 0.. Tensor {
if probabilities.shape != targets.shape || probabilities.data.length() == 0 {
panic()
}
let mut total = 0.0
for i in 0..= 1.0 {
panic()
}
total = total - (t * ln(p) + (1.0 - t) * ln(1.0 - p))
}
let out = Tensor::new(
[total / probabilities.data.length().to_double()],
[],
requires_grad=false,
)
out
}