चुनौतियों पर वापस जाएँ
मध्यम 0 हल किए गए 0% स्वीकृति

दो-लेयर नेटवर्क में फ़ॉरवर्ड प्रोपेगेशन

इनपुट को ReLU हिडन लेयर और sigmoid आउटपुट लेयर से गुज़ारें।

आप क्या सीखेंगे

  • हिडन लेयर और आउटपुट लेयर जोड़ना
  • एक लेयर का आउटपुट अगली में भेजना
  • पूरे नेटवर्क का अनुमान चलाना

समस्या

एक छोटे न्यूरल नेटवर्क में एक हिडन लेयर और एक आउटपुट लेयर होती है। डेटा इनसे होकर आगे बढ़ता है:

  1. हिडन लेयर: h_j = ReLU(inputs · hidden_weights[j] + hidden_biases[j]), जहाँ ReLU(z) = max(0, z)
  2. आउटपुट लेयर: y_k = sigmoid(h · output_weights[k] + output_biases[k]), जहाँ sigmoid(z) = 1 / (1 + e^(-z))

forward_pass(inputs, hidden_weights, hidden_biases, output_weights, output_biases) लागू करें।

इनपुट

inputs: n इनपुट मान।

hidden_weights, hidden_biases: हिडन लेयर, हर हिडन न्यूरॉन के लिए वेट की एक पंक्ति और एक बायस।

output_weights, output_biases: आउटपुट लेयर, हर आउटपुट के लिए एक पंक्ति और एक बायस; हर पंक्ति में हर हिडन न्यूरॉन के लिए एक वेट।

आउटपुट

नेटवर्क के आउटपुट y की सूची लौटाएँ।

सीमाएँ

1 ≤ इनपुट, हिडन न्यूरॉन, आउटपुट ≤ 50

-10 ≤ हर मान ≤ 10

उदाहरण

उदाहरण 1
इनपुट:
inputs = [1.0, 0.5]
hidden_biases = [0.0, 0.5]
output_biases = [0.0]
hidden_weights = [
    [1.0, -2.0],
    [0.5, 1.0]
]
output_weights = [
    [1.0, -1.0]
]

अपेक्षित आउटपुट:
expected = [0.182426]
इनपुट:
std::vector<double> inputs = {1.0, 0.5};
std::vector<double> hidden_biases = {0.0, 0.5};
std::vector<double> output_biases = {0.0};
std::vector<std::vector<double>> hidden_weights = {
    {1.0, -2.0},
    {0.5, 1.0}
};
std::vector<std::vector<double>> output_weights = {
    {1.0, -1.0}
};

अपेक्षित आउटपुट:
std::vector<double> expected = {0.182426};
इनपुट:
double[] inputs = new double[] {1.0, 0.5};
double[] hidden_biases = new double[] {0.0, 0.5};
double[] output_biases = new double[] {0.0};
double[][] hidden_weights = new double[][] {
    new double[] {1.0, -2.0},
    new double[] {0.5, 1.0}
};
double[][] output_weights = new double[][] {
    new double[] {1.0, -1.0}
};

अपेक्षित आउटपुट:
double[] expected = new double[] {0.182426};

व्याख्या

हिडन: ReLU(1×1 + 0.5×(-2) + 0) = ReLU(0) = 0 और ReLU(1×0.5 + 0.5×1 + 0.5) = 1.5। आउटपुट: sigmoid(0×1 + 1.5×(-1) + 0) = sigmoid(-1.5) ≈ 0.182426।

उदाहरण 2
इनपुट:
inputs = [2.0]
hidden_biases = [0.0, 0.0]
output_biases = [-1.0, 0.0]
hidden_weights = [
    [1.0],
    [-1.0]
]
output_weights = [
    [0.5, 0.5],
    [-0.5, 2.0]
]

अपेक्षित आउटपुट:
expected = [0.5, 0.268941]
इनपुट:
std::vector<double> inputs = {2.0};
std::vector<double> hidden_biases = {0.0, 0.0};
std::vector<double> output_biases = {-1.0, 0.0};
std::vector<std::vector<double>> hidden_weights = {
    {1.0},
    {-1.0}
};
std::vector<std::vector<double>> output_weights = {
    {0.5, 0.5},
    {-0.5, 2.0}
};

अपेक्षित आउटपुट:
std::vector<double> expected = {0.5, 0.268941};
इनपुट:
double[] inputs = new double[] {2.0};
double[] hidden_biases = new double[] {0.0, 0.0};
double[] output_biases = new double[] {-1.0, 0.0};
double[][] hidden_weights = new double[][] {
    new double[] {1.0},
    new double[] {-1.0}
};
double[][] output_weights = new double[][] {
    new double[] {0.5, 0.5},
    new double[] {-0.5, 2.0}
};

अपेक्षित आउटपुट:
double[] expected = new double[] {0.5, 0.268941};

व्याख्या

हिडन: ReLU(2) = 2 और ReLU(-2) = 0। आउटपुट 1: sigmoid(2×0.5 + 0 - 1) = sigmoid(0) = 0.5। आउटपुट 2: sigmoid(2×(-0.5) + 0) = sigmoid(-1) ≈ 0.268941।

कैसे हल करें

पहले खुद कोशिश करें, फिर एक-एक करके संकेत खोलें।

संकेत 1

पहले inputs से सारे hidden activations निकालें, फिर उन्हीं hidden outputs को final layer में दें.

संकेत 2

हर layer dot products और biases का batch है, hidden layer में ReLU और output में sigmoid लगती है.

संकेत 3

दूसरी layer में original inputs को मत मिलाएँ; वह सिर्फ hidden layer outputs देखती है.

अपेक्षित जटिलता

समय O(hn + oh), अतिरिक्त स्थान O(h + o)

संदर्भ

यह चुनौती CodeUtility के लिए अनुकूलित की गई है। ऊपर दिए गए स्टेटमेंट और सीमाओं का पालन करें।

दूसरों से सीखें

समुदाय समाधान

अभी तक कोई प्रकाशित समाधान नहीं। पहला साझा करने के लिए इस चुनौती को हल करें।