समस्या
बहुत बड़े या बहुत छोटे शुरुआती वेट से डीप नेटवर्क को ट्रेन करना मुश्किल हो जाता है। दो मानक तरीके लेयर के आकार से स्केल चुनते हैं, जहाँ fan_in इनपुट की संख्या और fan_out आउटपुट की संख्या है:
| method | लौटाता है |
|---|---|
"xavier_uniform" | सीमा √(6 / (fan_in + fan_out)), वेट [-सीमा, सीमा] से लिए जाते हैं |
"xavier_normal" | मानक विचलन √(2 / (fan_in + fan_out)) |
"he_uniform" | सीमा √(6 / fan_in) |
"he_normal" | मानक विचलन √(2 / fan_in) |
Xavier (Glorot) sigmoid और tanh लेयर के लिए ठीक है; He, ReLU लेयर के लिए।
init_bound(method, fan_in, fan_out) लागू करें।
इनपुट
method: "xavier_uniform", "xavier_normal", "he_uniform" या "he_normal" में से एक।
fan_in, fan_out: लेयर के इनपुट और आउटपुट की संख्या।
आउटपुट
सीमा या मानक विचलन को दशमलव संख्या के रूप में लौटाएँ।
सीमाएँ
1 ≤ fan_in, fan_out ≤ 100,000
उदाहरण
इनपुट:
fan_in = 3
method = "xavier_uniform"
fan_out = 3
अपेक्षित आउटपुट:
expected = 1.0
इनपुट:
long long fan_in = 3;
std::string method = "xavier_uniform";
long long fan_out = 3;
अपेक्षित आउटपुट:
double expected = 1.0;
इनपुट:
long fan_in = 3;
string method = "xavier_uniform";
long fan_out = 3;
अपेक्षित आउटपुट:
double expected = 1.0;
व्याख्या
√(6 / (3 + 3)) = √1 = 1, इसलिए वेट [-1, 1] से लिए जाते हैं।
इनपुट:
fan_in = 50
method = "he_normal"
fan_out = 10
अपेक्षित आउटपुट:
expected = 0.2
इनपुट:
long long fan_in = 50;
std::string method = "he_normal";
long long fan_out = 10;
अपेक्षित आउटपुट:
double expected = 0.2;
इनपुट:
long fan_in = 50;
string method = "he_normal";
long fan_out = 10;
अपेक्षित आउटपुट:
double expected = 0.2;
व्याख्या
He केवल fan_in का इस्तेमाल करता है: √(2 / 50) = √0.04 = 0.2।
संदर्भ
यह चुनौती CodeUtility के लिए अनुकूलित की गई है। ऊपर दिए गए स्टेटमेंट और सीमाओं का पालन करें।