Numpy.NET で ReLU レイヤー

C# で「ゼロから作るDeep Learning」に挑戦中。

今までは Numpy の .NET 移植版である NumSharp を使っていたけど、開発は停滞してるっぽい。足りない機能に直面する機会も増えてきて、このまま使い続けるのはキビシイ。

今回から、Numpy の .NET バインディングである Numpy.NET を試してみる。こちらは Numpy の機能をほぼ使えるようだ。

github.com

ReLU レイヤーを実装してみた。

using Numpy;

var x = np.array(new double[,]
{
    { 1.0, -0.5 },
    { -2.0, 3.0 },
});
Console.WriteLine(x);

var mask = (x <= 0.0);
Console.WriteLine(mask);

var relu = new Relu();
var @out = relu.forward(x);
Console.WriteLine(relu.mask);
Console.WriteLine(@out);

var dx = relu.backward(@out);
Console.WriteLine(dx);

public class Relu
{
    public NDarray? mask { get; private set; }

    public NDarray forward(NDarray x)
    {
        this.mask = (x <= 0.0);
        var @out = x.copy();
        @out[this.mask] = (NDarray)0;
        return @out;
    }

    public NDarray backward(NDarray dout)
    {
        dout[this.mask] = (NDarray)0;
        var dx = dout;
        return dx;
    }
}

Numpy.NET では x <= 0.0@out[this.mask] = (NDarray)0; が使えた。NumSharp ではこうはいかない。

.NET 6 で実行。