@DigitalAgonist
Студент

Нейросеть без библиотек. Как можно реализовать?

Наверное, буду реализовывать на С++ (возможно на другом ЯП, поддерживающем ООП).
По моему плану я выделил следующие классы:
neuron
layer
network

neuon содержит следующий код:
#pragma once
#include <math.h>

enum activation_function {
	GAUSSIAN,
	SOFTMAX,
	SINC
	// и т.д.
};

class neuron
{
public:
	double value;
	double error;
	const char* activation_function;

	neuron();
	neuron(double value, double error, const char* activation_function);

	void activation();

	double gaussian(double x);
	double softmax(double x);
	double sinc(double x);
	// и т. д.

	void save(); // для сохранения
	void restore(); // для восстановления из файла
	
};

Если я здесь ошибся, подскажите что исправить =). Ну и не совсем понятно что должно быть в других двух классах. Кто разбирается подскажите =)
  • Вопрос задан
  • 199 просмотров
Пригласить эксперта
Ответы на вопрос 3
mayton2019
@mayton2019
Bigdata Engineer
Если сфокусироваться на решении задач про созданию простой двухслойной нейросети то тебе
нужна матрица и вектор и операции над ними. И активационная функция. И функция обучения.

Вот это все
neuron
layer
network

я-бы на твоем месте не делал. Это уже архитектура и интеграция. Если развивать проект дальше.

И ты должен сам себе ответить на вопрос - что ты хочешь изучать. ООП или нейросети.
Нейросети это тяжелая тема. Там много экспериметов. Много разочарований. Много работ
дата-инжениринга по сбору и фильтрации входных данных. И этого всего настолько много
что для ООП там уже сил не остается. Тоесть твоя декомпозиция задачи на 3 класса на старте
тебе ничего пока не дает. Но обязывает тебя очень многому.

Я-бы предложил делать прототип в олипиадном стиле.

По поводу примерв. На гитхабе я находил много туториалов и пробных нейросетей на сях
созданных в рамках обучения
. Я искать их не будут. Я думаю ты сам найдешь.
Ответ написан
Maksim_64
@Maksim_64
Data Analyst
Ну ищи примеры и от них отталкивайся. Если нетворк будет состоять из одного скрытого слоя, то обратное распространение ошибки (backpropagation) не сложно. А вот если из нескольких то подсчет градиента будет происходить при помощи chain rule - это сложно реализовать.

Слой из параметров функция активации и выходная размерность.
Внутри слоя activation_fumction(dot(A,W) + b). где A - это входная матрица, W это изначально случайно инициализированная матрица весов с количеством рядов равных количеству колонок в матрице А и количеством колонок равных (output_size) параметр у слоя, размерность. то есть например A(10,3) то W должно быть (3,m) где m это то что ты укажешь в параметре выходная размерность каждого слоя. Та размерность которую ты получаешь на выходе после каждого слоя (10,m) в данном случае, b- вектор, с подходящей размерностью просто выполнить по элементное сложение, так же инициализируется случайно. Ну и dot - математическое умножение матриц.

Model нетворк, это коллекция слоев, имеет методы compile где ты указываешь loss функцию, то что ты будешь минимизировать, ну и наблюдаемые метрики. также имеет метод fit где ты не посредственно, обучаешь, имеет параметры batch (какими частями ты будешь подавать на вход (количество рядов в матрице)) количество эпох (сколько итераций по каждому batch), ну и данные не посредственно.

В целом ищи гайд. Так тут все сложно объяснить, и это сильно зависит сколько слоев. backpropagation на нескольких слоях это реально самый сложный момент. И он реально сложный.
Ответ написан
@AlexSku
не буду отвечать из-за модератора
Андрей Карпатый всё выложил на блюдечке (особенно автоградиент а-ля PyTorch).
Плейлист NN: from Zero to Hero.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы