Использование библиотеки Vectorflow для распознавания цифр

Использование библиотеки Vectorflow для распознавания цифр

Vectorflow — это мощная библиотека машинного обучения, разработанная для языка программирования D, которая обеспечивает гибкость и производительность при создании и обучении нейронных сетей. В данном руководстве мы рассмотрим использование Vectorflow для построения нейронной сети, предназначенной для распознавания рукописных цифр из известного набора данных MNIST. Этот процесс включает настройку проекта, подготовку данных, определение модели, обучение и тестирование.

Настройка проекта

Для начала работы с Vectorflow необходимо установить библиотеку. Это можно сделать с помощью менеджера пакетов DUB, добавив зависимость в ваш файл dub.json:

{
    "dependencies": {
        "vectorflow": "~>0.0.1"
    }
}

Затем можно создать основной файл проекта, например main.d.

Подготовка данных

Набор данных MNIST содержит изображения рукописных цифр размером 28×28 пикселей. Каждое изображение представлено в виде массива из 784 чисел (28*28). Vectorflow не включает встроенные методы для загрузки данных MNIST, поэтому мы воспользуемся сторонним скриптом для их загрузки и предварительной обработки.

import std.stdio;
import std.file;
import vectorflow;

void main() {
    auto trainingImages = loadMNISTImages("train-images-idx3-ubyte");
    auto trainingLabels = loadMNISTLabels("train-labels-idx1-ubyte");
    auto testImages = loadMNISTImages("t10k-images-idx3-ubyte");
    auto testLabels = loadMNISTLabels("t10k-labels-idx1-ubyte");

    // Нормализуем данные
    foreach (ref image; trainingImages)
        image[] /= 255.0;
    foreach (ref image; testImages)
        image[] /= 255.0;
}

Определение модели

Далее определим архитектуру нейронной сети. В этом примере мы используем простую полносвязную нейронную сеть с одним скрытым слоем.

auto model = new Sequential()
    .add(new Dense(784, 128)) // Входной слой с 784 нейронами и скрытый слой со 128 нейронами
    .add(new Relu())          // Функция активации ReLU
    .add(new Dense(128, 10))  // Выходной слой с 10 нейронами для 10 классов цифр
    .add(new Softmax());      // Функция активации Softmax для вероятностного распределения

Обучение модели

Для обучения модели нам понадобится функция потерь и оптимизатор. Мы используем кросс-энтропийную функцию потерь и стохастический градиентный спуск (SGD).

auto loss = new CrossEntropyLoss();
auto optimizer = new SGD(model.parameters(), 0.01);

int epochs = 10;
int batchSize = 64;

for (int epoch = 0; epoch < epochs; ++epoch) {
    foreach (batch; zip(trainingImages.chunks(batchSize), trainingLabels.chunks(batchSize))) {
        auto images = batch[0];
        auto labels = batch[1];

        optimizer.zeroGrad();
        auto output = model.forward(images);
        auto error = loss.forward(output, labels);
        loss.backward();
        model.backward();
        optimizer.step();

        writeln("Epoch ", epoch, ", Loss: ", error);
    }
}

Тестирование модели

После завершения обучения, необходимо протестировать модель на тестовом наборе данных.

int correct = 0;
foreach (image, label; zip(testImages, testLabels)) {
    auto output = model.predict(image);
    if (argmax(output) == label)
        ++correct;
}

float accuracy = cast(float) correct / testImages.length;
writeln("Test Accuracy: ", accuracy);

Пример кода

Ниже представлен полный пример кода для создания, обучения и тестирования нейронной сети с использованием библиотеки Vectorflow на языке D.

import std.stdio;
import std.file;
import vectorflow;

void main() {
    // Загрузка и подготовка данных
    auto trainingImages = loadMNISTImages("train-images-idx3-ubyte");
    auto trainingLabels = loadMNISTLabels("train-labels-idx1-ubyte");
    auto testImages = loadMNISTImages("t10k-images-idx3-ubyte");
    auto testLabels = loadMNISTLabels("t10k-labels-idx1-ubyte");

    foreach (ref image; trainingImages)
        image[] /= 255.0;
    foreach (ref image; testImages)
        image[] /= 255.0;

    // Определение модели
    auto model = new Sequential()
        .add(new Dense(784, 128))
        .add(new Relu())
        .add(new Dense(128, 10))
        .add(new Softmax());

    // Обучение модели
    auto loss = new CrossEntropyLoss();
    auto optimizer = new SGD(model.parameters(), 0.01);
    int epochs = 10;
    int batchSize = 64;

    for (int epoch = 0; epoch < epochs; ++epoch) {
        foreach (batch; zip(trainingImages.chunks(batchSize), trainingLabels.chunks(batchSize))) {
            auto images = batch[0];
            auto labels = batch[1];

            optimizer.zeroGrad();
            auto output = model.forward(images);
            auto error = loss.forward(output, labels);
            loss.backward();
            model.backward();
            optimizer.step();

            writeln("Epoch ", epoch, ", Loss: ", error);
        }
    }

    // Тестирование модели
    int correct = 0;
    foreach (image, label; zip(testImages, testLabels)) {
        auto output = model.predict(image);
        if (argmax(output) == label)
            ++correct;
    }

    float accuracy = cast(float) correct / testImages.length;
    writeln("Test Accuracy: ", accuracy);
}

Этот пример демонстрирует использование Vectorflow для создания и обучения нейронной сети, распознающей рукописные цифры из набора данных MNIST, с последующим тестированием и оценкой точности модели.


Карпов Ярослав

Автор статьи:

Обновлено:

23.05.2024


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *