|
Благодаря отличным новым возможностям NumSharp по срезке массивов, сообщество .NET приблизилось на шаг к созданию мощной платформы машинного обучения с открытым исходным кодом. Python — это язык машинного обучения отчасти потому, что у него есть отличные библиотеки, такие как NumPy и TensorFlow. Однако разработчикам C# также очень нужна мощная открытая библиотека для машинного обучения и науки о данных. NumSharp, порт NumPy C# организации SciSharp STACK, недавно сделал большой шаг вперёд, полностью реализовав возможности слайсинга, позволяя создавать произвольные подмножества N-мерных массивов в качестве эффективного просмотра исходных данных. Это делает его полезным инструментом для использования C# в машинном обучении вместе с TensorFlow.NET.
В чём проблема?
Если вы не пользовались NumPy, то, вероятно, не знаете, насколько хорош слайсинг. Python-массивы позволяют возвращать срез массива, индексируя серию элементов, следующим образом: a[start:stop:step]. Но только с помощью сложной реализации массива NumPy слайсинг становится по-настоящему мощной техникой обработки данных, без которой машинное обучение или наука о данных были бы немыслимы. К счастью, для тех, кто не может или не хочет переходить на Python для машинного обучения (который я тоже сделал), NumSharp приносит эту возможность в мир .NET. Как один из разработчиков в NumSharp, я познакомил вас с важными кейсами слайсинга с примерами кода на C#. Обратите внимание, что индексация нельзя выполнять на C# так же, как в Python, из-за различий в синтаксисе языка. Однако мы решили сохранить синтаксис Python для определений срезов, поэтому использовали строки для индексирования срезов на C#. Посмотрите этот пример, чтобы понять, насколько близок NumSharp к NumPy.
Вырезать столбец из матрицы в Python/NumPyПри написании на C# с помощью NumSharp код почти идентичен. Обратите внимание, что срезы индексируются немного иначе, используя строки в качестве параметров индексера.
Вырезать столбцы из матрицы в C#/NumSharpКак видно, команда NumSharp приложила много усилий, чтобы сделать код максимально похожим на Python. Это очень важно, потому что таким образом существующий код на Python, основанный на NumPy, теперь можно легко портировать на C#.
Сценарий использования: использовать несколько представлений одних и тех же данных
Возможность передавать только локальные части базовых данных (то есть небольшие участки больших изображений) в и из них без копирования критически важна для производительности во время выполнения, особенно для больших наборов данных. Срезы индексируются по локальным координатам, поэтому алгоритму не нужно знать глобальную структуру данных, что эффективно упрощает вашу жизнь и обеспечивает максимальную производительность, поскольку избегает ненужного дублирования.
Сценарии использования: редкие виды и рекурсивное срезывание
Разреженный вид массива можно создать, задавая шаги за пределами начала и конца диапазона срезов. Насколько я знаю, даже C# 8.0 с новым синтаксисом срезов массивов этого не делает. Эта особенность становится очень важной при работе с интерливированными данными. Вы можете спроектировать алгоритм для работы с непрерывными данными и предоставить ему разреженные срезы, имитирующие непрерывные источники данных, минимизируя сложность алгоритма.
Слайсинг можно разрезать дальше, что очень важно, если вы имеете дело с данными с большими размерами. Это также помогает снизить сложность алгоритма, так как можно уменьшить размерность данных с помощью рекурсивного слайсирования.
Сценарий использования: эффективная обработка данных с большими размерами
Если вам нужно рассматривать массив данных как объём и работать с его частями без необходимости делать невероятные вычисления преобразования координат, тогда .reshape() — ваш друг. Все массивы, созданные операциями слайсинга или слайсинга, являются .reshape(), просто видом исходных данных. Когда вы итерируете, читаете или записываете элементы в представление, вы получаете доступ к исходному массиву данных. NumSharp прозрачно выполняет соответствующие индексные преобразования для вас, чтобы вы могли индексировать срезы с относительными координатами.
Сценарий использования: Перевернуть порядок элементов без дополнительных затрат
Срезы с отрицательными шагами фактически меняют порядок срезов. Преимущество в том, что для этого не нужно копировать или перечислять данные, как и в IEnumerable.Reverse(). Разница в том, что представление (результат операции a["::-1"]) отображает данные в обратном порядке, и вы можете индексировать эту инвертированную последовательность без её перечисления.
Сценарий применения: Снизить сложность за счёт уменьшения размеров
При работе с крупноразмерными данными алгоритмы для этих данных также могут стать очень сложными. При использовании можно вывести любой объем больших размеров. Когда метод NumSharp от ToString() использует NDArray, я заметил, насколько простым и красивым стал алгоритм, систематически и рекурсивно разрезав ND-тома на (N-1)D и так далее. Этот подход «разделяй и властвуй» возвращает низкоразмерные субтомы, разрезав символы диапазона с помощью индексных символов NumSharp. Символ диапазона против индексного символаСимвол диапазона ["start:stop:step"] позволяет получить доступ к поддиапазону заданного объёма с одинаковой размерностью. Так что даже если вырезать только один столбец 2D-матрицы, получится 2D-матрица с одним столбцом. Вот короткий фрагмент кода на C#, который это демонстрирует:
Разрезайте столбец с помощью символа диапазона
Индексный символ даёт (N-1) размерный срез в указанном месте N-мерного родительского объёма. Таким образом, вырезание столбца из двумерной матрицы с помощью индексных символов даёт одномерный вектор:
Срез столбцов с индексными символами
Если вы не заметили разницы с первого взгляда, вот два определения срезов рядом с ними — ange[":,2:3"] против index[":,2"], которые сильно влияют на результаты. Полное упоминание нового символа среза можно найти на вики NumSharp.
Примечание: <T>ArraySlice
Реализуя срез N-мерных видов, я пришёл к выводу, что это может быть интересно для многих других областей .NET, поэтому разбил её на собственную автономную библиотеку под названием SliceAndDice. Он является лёгкой обёрткой для индексации любой структуры данных C# (например, ArraySlice или<T>) и позволяет использовать те же механизмы ремоделирования, слайзинга и просмотра без всех остальных сложных числовых вычислений. Достаточно всего нескольких сотен строк кода, чтобы добиться отличных возможностей слайсинга! T[]IList<T>
циклический переход
NumSharp недавно получил такой же механизм слайсирования и просмотра, что, несомненно, делает NumPy одной из важнейших библиотек в экосистеме машинного обучения на Python. SciSharp STACK — это организация с открытым исходным кодом, объединяющая небольшое количество квалифицированных разработчиков, которые усердно работали, чтобы привнести ту же функциональность в мир .NET. Последние улучшения NumSharp являются важным краеугольным камнем для достижения этой цели. Исходный текст:Вход по гиперссылке виден.
|