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, с последующим тестированием и оценкой точности модели.
Автор статьи:
Обновлено:
Добавить комментарий