समस्या
मल्टी-क्लास क्लासिफ़ायर हर क्लास के लिए एक प्रायिकता देता है (जैसे सॉफ्टमैक्स से)। कैटेगोरिकल क्रॉस-एंट्रॉपी उसे तब दंडित करती है जब वह सही क्लास को कम प्रायिकता देता है:
loss = -(ln(p₁) + ln(p₂) + … + ln(pₙ)) / n
जहाँ pᵢ वह प्रायिकता है जो मॉडल ने सैंपल i की सही क्लास को दी। ln(0) से बचने के लिए पहले 0.0000001 से कम हर प्रायिकता को 0.0000001 तक बढ़ा दें।
categorical_cross_entropy(probabilities, labels) लागू करें।
इनपुट
probabilities: हर सैंपल के लिए एक पंक्ति, हर क्लास की एक प्रायिकता के साथ।
labels: हर सैंपल की सही क्लास का इंडेक्स (0 से शुरू)।
आउटपुट
औसत लॉस को दशमलव संख्या के रूप में लौटाएँ।
सीमाएँ
1 ≤ सैंपल ≤ 1,000, 2 ≤ क्लास ≤ 100
0 ≤ हर प्रायिकता ≤ 1
0 ≤ labels[i] < क्लास की संख्या
उदाहरण
इनपुट:
labels = [0, 1]
probabilities = [
[0.7, 0.2, 0.1],
[0.1, 0.8, 0.1]
]
अपेक्षित आउटपुट:
expected = 0.289909
इनपुट:
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}
};
अपेक्षित आउटपुट:
double expected = 0.289909;
इनपुट:
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}
};
अपेक्षित आउटपुट:
double expected = 0.289909;
व्याख्या
सही क्लास को 0.7 और 0.8 मिले: -(ln(0.7) + ln(0.8)) / 2 = -(-0.356675 - 0.223144) / 2 ≈ 0.289909।
इनपुट:
labels = [1]
probabilities = [
[1.0, 0.0]
]
अपेक्षित आउटपुट:
expected = 16.118096
इनपुट:
std::vector<long long> labels = {1};
std::vector<std::vector<double>> probabilities = {
{1.0, 0.0}
};
अपेक्षित आउटपुट:
double expected = 16.118096;
इनपुट:
long[] labels = new long[] {1};
double[][] probabilities = new double[][] {
new double[] {1.0, 0.0}
};
अपेक्षित आउटपुट:
double expected = 16.118096;
व्याख्या
सही क्लास को प्रायिकता 0 मिली, जिसे 0.0000001 तक बढ़ाया जाता है, इसलिए लॉस -ln(0.0000001) ≈ 16.118096 है: आत्मविश्वास से दिया गया गलत जवाब भारी दंड पाता है।
संदर्भ
यह चुनौती CodeUtility के लिए अनुकूलित की गई है। ऊपर दिए गए स्टेटमेंट और सीमाओं का पालन करें।