NumSharp で 3 層ニューラルネットワーク

「ゼロから作る Deep Learning」を読んで、Python ではなく C# でゼロから作ってみる続き。今回は 3 層ニューラルネットワークを実装してみた。

NumSharp の np.dot が、1 次元の配列から作った NDArray とジャグ配列から作った NDArray の内積をサポートしていなかったけど、ジャグ配列で揃えたら上手くいった。

using NumSharp;

var network = InitNetwork();
var x = np.array(new double[][]
{
    new [] { 1.0, 0.5 },
});
var y = Forward(network, x);
Console.WriteLine(y.ToString());

Console.ReadLine();


static NDArray IdentityFunction(NDArray x) => x;

static NDArray Sigmoid(NDArray x) =>
    1 / (1 + np.exp(x * -1));

static IReadOnlyDictionary<string, NDArray> InitNetwork()
{
    var network = new Dictionary<string, NDArray>();

    network["W1"] = np.array(new double[][]
    {
        new [] { 0.1, 0.3, 0.5 },
        new [] { 0.2, 0.4, 0.6 },
    });
    network["b1"] = np.array(0.1, 0.2, 0.3);
    network["W2"] = np.array(new double[][]
    {
        new [] { 0.1, 0.4 },
        new [] { 0.2, 0.5 },
        new [] { 0.3, 0.6 },
    });
    network["b2"] = np.array(0.1, 0.2);
    network["W3"] = np.array(new double[][]
    {
        new [] { 0.1, 0.3 },
        new [] { 0.2, 0.4 },
    });
    network["b3"] = np.array(0.1, 0.2);

    return network;
}

static NDArray Forward(IReadOnlyDictionary<string, NDArray> network, NDArray x)
{
    var W1 = network["W1"];
    var W2 = network["W2"];
    var W3 = network["W3"];
    var b1 = network["b1"];
    var b2 = network["b2"];
    var b3 = network["b3"];

    var a1 = np.dot(x, W1) + b1;
    var z1 = Sigmoid(a1);
    var a2 = np.dot(z1, W2) + b2;
    var z2 = Sigmoid(a2);
    var a3 = np.dot(z2, W3) + b3;
    var y = IdentityFunction(a3);

    return y;
}

.NET 6 で実行。

四捨五入したら書籍と同じ値になるのでヨシ!