{"id":20585390,"url":"https://github.com/stanislavgrigoriev/easycntk","last_synced_at":"2025-07-02T13:40:38.510Z","repository":{"id":144134717,"uuid":"185981516","full_name":"StanislavGrigoriev/EasyCNTK","owner":"StanislavGrigoriev","description":"C# library for easy Deep Learning and Deep Reinforcement Learning. It is wrapper over C# CNTK API. Has implementation of layers (LSTM, Convolution etc.), optimizers, losses, shortcut-connections, sequential model, sequential  multi-output model, agent teachers, policy gradients, actor-critic etc.  Contains helpers for work with dataset (split, statistics, SMOTE etc). Allows train, evaluate and inference deep neural networks in style similar to Keras.","archived":false,"fork":false,"pushed_at":"2020-05-07T05:49:02.000Z","size":15843,"stargazers_count":19,"open_issues_count":2,"forks_count":8,"subscribers_count":7,"default_branch":"master","last_synced_at":"2025-06-11T20:35:53.700Z","etag":null,"topics":["c-sharp","cntk","cognitive-toolkit","deep-learning","deep-learning-library","deep-neural-networks","machine-learning"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/StanislavGrigoriev.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2019-05-10T12:05:34.000Z","updated_at":"2025-03-21T16:08:26.000Z","dependencies_parsed_at":null,"dependency_job_id":"65dc7f5c-feb8-491c-98e6-605ca548bb04","html_url":"https://github.com/StanislavGrigoriev/EasyCNTK","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/StanislavGrigoriev/EasyCNTK","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/StanislavGrigoriev%2FEasyCNTK","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/StanislavGrigoriev%2FEasyCNTK/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/StanislavGrigoriev%2FEasyCNTK/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/StanislavGrigoriev%2FEasyCNTK/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/StanislavGrigoriev","download_url":"https://codeload.github.com/StanislavGrigoriev/EasyCNTK/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/StanislavGrigoriev%2FEasyCNTK/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":263149322,"owners_count":23421355,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["c-sharp","cntk","cognitive-toolkit","deep-learning","deep-learning-library","deep-neural-networks","machine-learning"],"created_at":"2024-11-16T07:07:54.720Z","updated_at":"2025-07-02T13:40:38.488Z","avatar_url":"https://github.com/StanislavGrigoriev.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"﻿# EasyCNTK\nEasyCNTK - C# библиотека для глубокого обучения. Является оберткой над C# CNTK API, позволяет конфигурировать и обучать нейронные сети используя более высокоуровневые абстракции, похожие на Keras. Содержит реализации слоев, оптимизаторов, функций потерь, метрики для оценки качества классификации и регрессии, а так же вспомогательные методы для вычисления статистики датасета, сбалансированного разбиения и т.п. Библиотека ориентирована на пользователей имеющих некоторые знания в глубоком обучении и отдаленно знакомых с C# CNTK API, но желающих тренировать нейросети из кода на C#.\n## Быстрый старт\n__1__. Установить NuGet пакет EasyCNTK:\n```\nPM\u003e Install-Package EasyCNTK\n```\nВместе с ним будет установлен `CNTK.GPU v2.7` - который позволяет производить обучение на CPU и GPU. В дальнейшем будет сборка для `CPUOnly` проектов. EasyCNTK написан под `.net Standart 2.0`.  \n__2__. Переключить проект (и все используемые им проекты/сборки) в конфигурацию платформы `x64`. Без этого работать ничего не будет, поскольку `CNTK` реализован только на платформе `x64`.  \n__3__. Добавить директивы Using: \n```\nusing CNTK;\nusing EasyCNTK;\nusing EasyCNTK.ActivationFunctions;\nusing EasyCNTK.Layers;\nusing EasyCNTK.Learning;\nusing EasyCNTK.Learning.Metrics;\nusing EasyCNTK.Learning.Optimizers;\nusing EasyCNTK.LossFunctions;\n```\n__4__. Пример одноклассовой классификации:\n```\nList\u003cdouble[]\u003e dataset = LoadMyDataset();//вначале массива признаки, затем метки классов\ndataset.SplitBalanced(0.7, //разбивает датасет на 2 части в заданном соотношении, сохраняя одинаковое распределение классов в обоих частях\n    sample =\u003e sample.Last(), //определение метки классов вычисления их распределения \n    out var datasetTrain,\n    out var datasetTest,\n    randomizeSplit: true);\n\n//Статистика для каждого признака (среднее, мин, макс, дисперсия, медиана и т.п.) \nList\u003cFeatureStatistic\u003e statistic = dataset.ComputeStatisticForCollection(); \n\nvar device = DeviceDescriptor.GPUDevice(0); //указали что хотим обучать на GPU\nint minibatchSize = 512;\nint inputDimension = 784;\nint epochs = 50;\n\n//создание модели. Поддерживаются float и double веса нейросети\nvar model = new Sequential\u003cdouble\u003e(device, new[] { inputDimension });\nmodel.Add(new Residual2(784, new Tanh()));\nmodel.Add(new Residual2(300, new Tanh()));\nmodel.Add(new Dense(10, new Sigmoid()));\n\n//обучение модели. Поддерживается множество перегрузок, для разных вариантов обучения\nvar fitResult = model.Fit(\n    trainData: datasetTrain,\n    inputDim: inputDimension,\n    minibatchSize: minibatchSize,\n    lossFunction: new SquaredError(),\n    evaluationFunction: new ClassificationError(),\n    optimizer: new Adam(0.1, 0.9, minibatchSize),\n    epochCount: epochs,\n    device: device,\n    shuffleSampleInMinibatchesPerEpoch: false,\n    ruleUpdateLearningRate: (epoch, learningRate) =\u003e epoch % 10 == 0 ? 0.95 * learningRate : learningRate,\n    actionPerEpoch: (epoch, loss, eval) =\u003e //Вход: эпоха, ошибка loss, ошибка eval. Выход: true - закончить обучение, false - продолжить.\n{\n    //необязательный метод, используется для произвольных действий пользователя\n\n    Console.WriteLine($\"Loss: {loss:F10} Eval: {eval:F3} Epoch: {epoch}\"); //например отображаем прогресс обучения\n    if (eval \u003c 0.05) //или ранняя остановка: если ошибка классфикации меньше 5%, сохраем модель в файл и заканчиваем обучение\n    {\n            model.SaveModel($\"{model}.model\", saveArchitectureDescription: false);\n            return true;\n        }\n        return false;\n    });\n\nTimeSpan duration = fitResult.Duration;//продолжительность обучения\nint epochCount = fitResult.EpochCount;//количесво эпох обучения\ndouble lossError = fitResult.LossError;//ошибка функции потерь\ndouble evaluationError = fitResult.EvaluationError;//ошибка оценочной функции\n\nOneLabelClassificationMetrics metricsTest = model\n        .Evaluate(datasetTest, inputDimension, device) //выполняем оценку (Predict) для контрольных примеров датасета\n        .GetOneLabelClassificationMetrics(); //вычисляем метрики оценки одноклассовой(многоклассовой/бинарной) классификации(регрессии)\ndouble accuracy = metricsTest.Accuracy;\ndouble[,] confusionMatrix = metricsTest.ConfusionMatrix; //матрица ошибок, использует процентное отображение\nList\u003cClassItem\u003e classesDistribution = metricsTest.ClassesDistribution;\nint classIndex = classesDistribution[0].Index; //индекс выхода нейросети, закрепленный за классом\ndouble classPrecision = classesDistribution[0].Precision; \ndouble classRecall = classesDistribution[0].Recall; \ndouble classFraction = classesDistribution[0].Fraction; //доля примеров этого класса в контрольной выборке\n```\nБольше примеров доступно в папке __[Examples](https://github.com/StanislavGrigoriev/EasyCNTK/tree/master/Examples)__.\n***\nДокументация постепенно будет дополняться, то же касается и примеров использования. Со временем добавятся новые реализации слоев(Attention, Convolution3D и т.д.), механизм обучения с подкреплением, дополнительных функций расчета статистики и т.п.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstanislavgrigoriev%2Feasycntk","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fstanislavgrigoriev%2Feasycntk","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstanislavgrigoriev%2Feasycntk/lists"}