Đề bài
Bộ phân loại nhiều lớp đưa ra một xác suất cho mỗi lớp (ví dụ từ softmax). Categorical cross-entropy phạt mô hình khi nó gán xác suất thấp cho lớp đúng:
loss = -(ln(p₁) + ln(p₂) + … + ln(pₙ)) / n
với pᵢ là xác suất mô hình gán cho lớp đúng của mẫu i. Để tránh ln(0), trước tiên hãy nâng mọi xác suất nhỏ hơn 0.0000001 lên 0.0000001.
Hãy cài đặt categorical_cross_entropy(probabilities, labels).
Đầu vào
probabilities: Mỗi mẫu một hàng, mỗi lớp một xác suất.
labels: Chỉ số lớp đúng của từng mẫu (bắt đầu từ 0).
Đầu ra
Trả về giá trị mất mát trung bình dưới dạng số thực.
Ràng buộc
1 ≤ số mẫu ≤ 1.000, 2 ≤ số lớp ≤ 100
0 ≤ mỗi xác suất ≤ 1
0 ≤ labels[i] < số lớp
Ví dụ
Đầu vào:
labels = [0, 1]
probabilities = [
[0.7, 0.2, 0.1],
[0.1, 0.8, 0.1]
]
Kết quả mong đợi:
expected = 0.289909
Đầu vào:
std::vector<long long> labels = {0, 1};
std::vector<std::vector<double>> probabilities = {
{0.7, 0.2, 0.1},
{0.1, 0.8, 0.1}
};
Kết quả mong đợi:
double expected = 0.289909;
Đầu vào:
long[] labels = new long[] {0, 1};
double[][] probabilities = new double[][] {
new double[] {0.7, 0.2, 0.1},
new double[] {0.1, 0.8, 0.1}
};
Kết quả mong đợi:
double expected = 0.289909;
Giải thích
Các lớp đúng nhận xác suất 0.7 và 0.8: -(ln(0.7) + ln(0.8)) / 2 = -(-0.356675 - 0.223144) / 2 ≈ 0.289909.
Đầu vào:
labels = [1]
probabilities = [
[1.0, 0.0]
]
Kết quả mong đợi:
expected = 16.118096
Đầu vào:
std::vector<long long> labels = {1};
std::vector<std::vector<double>> probabilities = {
{1.0, 0.0}
};
Kết quả mong đợi:
double expected = 16.118096;
Đầu vào:
long[] labels = new long[] {1};
double[][] probabilities = new double[][] {
new double[] {1.0, 0.0}
};
Kết quả mong đợi:
double expected = 16.118096;
Giải thích
Lớp đúng nhận xác suất 0, được nâng lên 0.0000001, nên mất mát là -ln(0.0000001) ≈ 16.118096: một câu trả lời sai mà tự tin bị phạt rất nặng.
Tham khảo
Thử thách này đã được điều chỉnh cho CodeUtility. Hãy làm theo đề bài và các ràng buộc ở trên.