C# で「ゼロから作るDeep Learning」に挑戦中。
今までは Numpy の .NET 移植版である NumSharp を使っていたけど、開発は停滞してるっぽい。足りない機能に直面する機会も増えてきて、このまま使い続けるのはキビシイ。
今回から、Numpy の .NET バインディングである Numpy.NET を試してみる。こちらは Numpy の機能をほぼ使えるようだ。
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 で実行。