Künstliche Intelligenz 25.09.2024, 16:32 Uhr

AlbiruniML: Eine C#-Bibliothek für lineare Algebra und maschinelles Lernen

AlbiruniML bietet Entwicklern eine leistungsstarke Plattform für lineare Algebra und maschinelles Lernen in C#, inspiriert von TensorFlow.
(Quelle: EMGenie)
Die Open-Source-Bibliothek AlbiruniML ist in C# geschrieben und bietet eine ansprechende Alternative zu anderen etablierten Bibliotheken wie TensorFlow und PyTorch. Diese Bibliothek wurde inspiriert von TensorFlow und dem Team hinter TensorFlow.js, wobei sie sich auf die Kernprinzipien der linearen Algebra stützt.
Die Hauptmerkmale von AlbiruniML umfassen die Unterstützung von NDArray und Tensoroperationen sowie automatische Ableitungen, die für maschinelles Lernen unerlässlich sind. Zum jetzigen Zeitpunkt unterstützt die Bibliothek ausschliesslich die Verarbeitung auf der CPU, jedoch sind native CBLAS-Unterstützung und GPU-Kernel mit CUDA für die Zukunft in Planung, um die Leistungsfähigkeit zu verbessern.
Ein besonderer Vorteil von AlbiruniML ist die Möglichkeit, zahlreiche TensorFlow-Modelle problemlos zu importieren, was Entwicklern einiges an Zeit und Aufwand spart. Den Benutzern wird auch ein einfaches und flexibles API geboten, das den Einstieg erleichtert. Um die Bibliothek zu nutzen, können Entwickler die benötigten Namensräume importieren und den Tensor-Datentyp verwenden, der als grundlegende Datenstruktur für alle Operationen dient.
Die Bibliothek wurde so konzipiert, dass sie ohne Drittanbieterkomponenten aufgebaut werden kann, was bedeutet, dass Entwickler sie direkt mit Visual Studio in einer x64-Umgebung kompilieren können. Der Prozess des Erstellens von Modellen und der Durchführung von Berechnungen wird durch bereitgestellte Funktionen wie das Definieren von Variablen, das Einrichten von Optimierern und das Training von Modellen vereinfacht.
Ein einfaches Beispiel für die Nutzung von AlbiruniML zeigt, wie ein logistisches Regressionsmodell konkret implementiert wird: Zahlen kleiner als 15 ergeben false und Zahlen grösser als 15 ergeben true. Durch die Definition eines Modells und den nachfolgenden Trainingsprozess können Benutzer die Stärke ihrer Modelle testen und die Ergebnisse in der Konsole ausgeben. 
using System;
using Albiruni;
using alb = Albiruni.Ops;
namespace SimpleExample
{
    class Program
    {
        static void Main(string[] args)
        {
            Tensor xs1 = new float[]
            { 1f, 20f, 11f, 21f, 15, 25, 5, 30, 4, 20, 6, 11.5f, 22 }.ToTensor();

            Tensor ys1 = new float[]
            { 0f, 1f, 0f, 1f, 0, 1, 0, 1, 0, 1, 0, 0, 1 }.ToTensor();

            Random r = new Random();
            var a = alb.variable(alb.scalar((float)r.NextDouble()));
            var c = alb.variable(alb.scalar(0));
            
            var learningRate = 0.1f;
            var optimizer = alb.train.sgd(learningRate);
            
            Func<Tensor, Tensor> model = (Tensor x) =>
            {
                var y = a * x + c;
                return y.sigmoid();
            };
            
            Action<Tensor, Tensor, int, Action> train =
            (Tensor examples, Tensor label, int numIterations, Action done) =>
            {
                for (int iter = 0; iter < numIterations; iter++)
                {
                    optimizer.minimize(() =>
                    {
                        // Feed the examples into the model
                        var pred = model(examples);
                        var predLoss = alb.loss.meanSquaredError(label, pred);
                        return predLoss;
                    });
                }
                done();
            };

            Action<Tensor, Tensor> test = (Tensor xs, Tensor ys) =>
            {
                var xvalues = xs.ToArray();
                var yvalues = ys.ToArray();
                var predictedYs = model(xs).ToArray();
                Console.Write("Expected : ");
                for (int i = 0; i < yvalues.Length; i++)
                {
                    Console.Write(yvalues[i].ToString() + ", ");
                }
                Console.WriteLine();
                Console.Write("Got      : ");
                for (int i = 0; i < predictedYs.Length; i++)
                {
                    var pred = predictedYs[i] > 0.5f ? 1 : 0;
                    Console.Write(pred.ToString() + ", ");
                }
            };

            train(xs1, ys1, 1000, () =>
            {
                test(xs1, ys1);
            });
        }
    }
}
Das Modell zeigt vielversprechende Ergebnisse, was darauf hinweist, dass die Bibliothek in realen Anwendungen anwendbar ist.



Kommentare
Es sind keine Kommentare vorhanden.