中級 0件解決済み 正答率0%

全結合層の順伝播

活性化関数を選べる全結合層のニューロンの出力を計算します。

このチャレンジで学べること

  • ニューロンの層全体を一度に計算する
  • 選んだ活性化関数を各出力に適用する
  • 重みをニューロンごとに 1 行で表す

問題

原文(英語)を表示

全結合層(dense層)は、すべて同じ入力を受け取るニューロンの集まりです。ニューロン j は自分の重み weights[j] とバイアス biases[j] を持ちます。

z_j = inputs · weights[j] + biases[j]

その後、層の活性化関数を各 z_j に適用します。

  • "linear": z_j をそのまま出力
  • "relu": max(0, z_j)
  • "sigmoid": 1 / (1 + e^(-z_j))

dense_forward(inputs, weights, biases, activation) を実装してください。

入力

inputs: n 個の入力値。

weights: ニューロンごとに1行。各行は n 個の重みを持ちます。

biases: ニューロンごとに1つのバイアス。

activation: "linear"、"relu"、"sigmoid" のいずれか。

出力

ニューロンごとの出力のリストを順番に返してください。

制約

1 ≤ n ≤ 100、1 ≤ ニューロン数 ≤ 100

-10 ≤ 各値 ≤ 10

例

例 1
入力:
biases = [0.0, -1.0]
inputs = [1.0, 2.0]
weights = [
    [0.5, -1.0],
    [1.5, 0.5]
]
activation = "relu"

期待される出力:
expected = [0.0, 1.5]
入力:
std::vector<double> biases = {0.0, -1.0};
std::vector<double> inputs = {1.0, 2.0};
std::vector<std::vector<double>> weights = {
    {0.5, -1.0},
    {1.5, 0.5}
};
std::string activation = "relu";

期待される出力:
std::vector<double> expected = {0.0, 1.5};
入力:
double[] biases = new double[] {0.0, -1.0};
double[] inputs = new double[] {1.0, 2.0};
double[][] weights = new double[][] {
    new double[] {0.5, -1.0},
    new double[] {1.5, 0.5}
};
string activation = "relu";

期待される出力:
double[] expected = new double[] {0.0, 1.5};

解説

ニューロン1:1×0.5 + 2×(-1) + 0 = -1.5、ReLU で 0 になります。ニューロン2:1×1.5 + 2×0.5 - 1 = 1.5、ReLU はそのまま残します。結果は [0, 1.5] です。

例 2
入力:
biases = [1.0, 0.0, -1.5]
inputs = [3.0]
weights = [
    [2.0],
    [-1.0],
    [0.5]
]
activation = "linear"

期待される出力:
expected = [7.0, -3.0, 0.0]
入力:
std::vector<double> biases = {1.0, 0.0, -1.5};
std::vector<double> inputs = {3.0};
std::vector<std::vector<double>> weights = {
    {2.0},
    {-1.0},
    {0.5}
};
std::string activation = "linear";

期待される出力:
std::vector<double> expected = {7.0, -3.0, 0.0};
入力:
double[] biases = new double[] {1.0, 0.0, -1.5};
double[] inputs = new double[] {3.0};
double[][] weights = new double[][] {
    new double[] {2.0},
    new double[] {-1.0},
    new double[] {0.5}
};
string activation = "linear";

期待される出力:
double[] expected = new double[] {7.0, -3.0, 0.0};

解説

線形活性化では、出力は 3×2 + 1 = 7、3×(-1) + 0 = -3、3×0.5 - 1.5 = 0 となるだけです。

参考資料

この課題はCodeUtility用に調整されています。上記の説明と制約に従ってください。

他の人の解答から学ぶ

コミュニティの解答

まだ公開された解答がありません。この課題を解いて最初の解答を共有しましょう。