Рейтинг@Mail.ru

Машинное обучение с помощью технологии ML.NET на VB.NET

Print Friendly, PDF & Email
Все примеры по машинному обучению с помощью Microsoft ML.NET даются на языке C#. Мы же напишем наше первое приложение по машинному обучению с помощью технологии ML.NET на языке Visual Basic .NET.

1Что такое машинное обучениеи где его применяют

В самом общем виде машинное обучение – это решение таких задач с помощью компьютера, где трудно или невозможно написать обычный алгоритм для получения нужного результата. Например, задача определения образов на фото или видео даже для ребёнка будет элементарной. Однако чтобы «научить» компьютер распознавать условную кошку на фотографии, от программиста требуются огромные усилия. Допустим, программист может определить кошку как что-то полосатое и серое, с головой, 4-мя лапами и хвостом. Но под такое описание может попасть какое-то другое животное, а кошки других окрасов не попадут. Кроме того, а если на фотографии видно только три лапы и не видно хвоста? А если кошка находится в такой позе, что она вообще не похожа на кошку? И так далее, и тому подобное.

Как видно, количество возможных вариантов в подобного рода задачах может превышать все мыслимые пределы, и программист конечно же не сможет учесть все из них. Как раз для таких случаев и применяется машинное обучение. Это лишь один пример применения машинного обучения, однако их гораздо больше. Вот ещё несколько примеров:

  • распознавание речи;
  • распознавание текстов, в том числе рукописных;
  • распознавание лиц или иных объектов на фотографии или видеозаписи;
  • автоматический подбор настроек фото- или видеокамеры для наилучшего качества съёмки;
  • восстановление старинных фото- и видеозаписей;
  • автомобили и летательные аппараты без водителя или пилота;
  • прогнозирование стоимости ценной бумаги на бирже;

Применений для машинного обучения с каждым днём находится всё больше и больше. Причём множество задач алгоритмы решают гораздо лучше, чем человек. Например, ещё 5 лет назад проводились соревнования между компьютером и человеком в таких играх как шашки, шахматы и т.п. Сегодня компьютерное обучение достигло такого уровня, что ни один чемпион по шахматам не сможет выиграть у машины. Или другой пример. Если посадить человека перед камерой, где непрерывным потоком идёт толпа людей (например, система видеонаблюдения в метро), и дать ему задачу отыскать в толпе кого-то конкретного, то уже через 5 минут пристального всматривания в монитор у человека глаза полезут на лоб. А компьютер справится с этой задачей на ура.

По способу работы виды машинного обучения можно разделить так:

  • Обучение с учителем – это обучение на массиве объектов, когда программа точно знает, какие объекты она ищет и где они в обучающем массиве. Задачей этого вида обучение является нахождение закономерности, которой связан каждый рассматриваемый объект с искомым. Например, есть 1000 фотографий кошек, и программе при обучении точно сообщили, на каких фотографиях точно есть кошки.
  • Частичное обучение – при частичном обучении часть ответов неизвестна.
  • Обучение без учителя – программа ищет в массиве не объекты, а связи между объектами.
  • Обучение с подкреплением – программа пытается найти оптимальную стратегию, имея обратную связь.

Машинное обучение тесно связано с нейронными сетями. Точнее, нейронные сети – это один из видов машинного обучения.

Постоянно появляются новые виды машинного обучения, которые призваны улучшить уже существующие. Например, есть нейронные сети с обучением, в которых сама сеть генерирует обучающую выборку. Это решает проблему, если исходных данных для обучения слишком мало. Существуют состязательные сети, когда одна нейронная сеть решает какую-то свою задачу, а другая сеть пытается найти уязвимость в решении и таким образом первая сеть должна решать свою задачу всё лучше и лучше.

Нейронные сети и другие виды машинного обучения иногда называют искусственным интеллектом. Однако надо понимать, что конечно же, это совсем не интеллект, а просто алгоритмы, хотя и весьма специфические, которые способны решать нетривиальные «умные» задачи.

Надо также помнить, что результат работы нейронной сети или других видов машинного обучения всегда даётся с какой-то вероятностью. То есть, если возвратиться к нашей исходной задаче поиска кошки на фото, то алгоритм машинного обучения найдёт кошек с какой-то вероятностью, не равной 100%. Это может быть 60, 80 или даже 95%, но никогда не 100%. Хотя зачастую 60%, полученные компьютером, могут быть лучше, чем способен выдать человек. Например, если ваш алгоритм ставит диагноз человеку по снимку внутренних органов, то наверное вероятность 60% будет недостаточна. А если задача – определить в темноте на расстоянии 1 км номер автомобиля на видео, то наверное 60% это даже много. Т.е. зависит от задачи, которую вы собираетесь решать с помощью машинного обучения, какая вероятность вас устроит.

Ещё одной особенностью машинного обучения можно считать то, что каждый алгоритм выполняет как правило одну (или несколько связанных) задач. Не существует универсальных алгоритмов, которые могут решать широкий круг задач. Это как раз присуще человеческому интеллекту, но не искусственному. Хотя, кто знает, возможно это ограничение вызвано недостатком вычислительной мощности современных компьютеров, и в недалёком будущем эта задача будет решена…

2Предварительные действия для работы с машинным обучением на Visual Basic

Майкрософт, конечно же, не могла остаться в стороне от набирающей популярности темы, которая к тому же, очень многообещающая, и создала свой фреймворк для машинного обучения. Он называется ML.NET (от machine learning для .NET). Начать его изучать можно с данной статьи, а далее – с руководства по ML.NET.

Прежде чем использовать ML.NET (machine learning для платформы .NET), в системе должны быть установлены:

  • .NET Core;
  • пакет ML.NET;
  • Visual Studio 16.6.1 или более поздней версии.

Установку .NET Core мы уже вкратце обсужадали. В статье был описан алгоритм разработки программ на .NET Core, а также дана сслыка на скачивание SDK.

Скачать ML.NET, а заодно и изучить вводные материалы по данной технологии можно на сайте Микрософт.

Студию скачиваем, конечно же, также с официального сайта Microsoft.

Как только всё это будет установлено, мы готовы начать работу с машинным обучением на ML.NET.

3Пример программы машинного обученияна VB.NET

Возьмём пример из блога компании Microsoft на Хабре, немного изменим и адаптируем его для VB.NET (а также исправим ошибку в приведённом C# коде). Скачаем файл с данными для обучения модели. Его нужно положить в директорию /bin проекта. Или можно поставить в свойствах файла через проводник по решению указать действие при компиляции – копировать в выходную директорию. Далее создадим проект консольного приложения .NET Core, переименуем файл Module1.vb в Program.vb (не обязательно) и напишем в нём следующий код:

Imports Microsoft.ML
Imports Microsoft.ML.Data
Imports Microsoft.ML.Transforms

Module Program

    'Шаг 1: Определите ваши структуры данных

    ''' <summary>
    ''' Используется для предоставления обучающих данных, а также как введение для предиктивных операций.
    ''' </summary>
    Public Class IrisData

        ''' <summary>
        ''' Первые 4 свойства - это входные данные / функции, используемые для прогнозирования метки label.
        ''' </summary>
        <LoadColumn(0)>
        Public SepalLength As Single

        <LoadColumn(1)>
        Public SepalWidth As Single

        <LoadColumn(2)>
        Public PetalLength As Single

        <LoadColumn(3)>
        Public PetalWidth As Single

        ''' <summary>
        ''' Label - это то, что вы предсказываете, и устанавливается только при обучении.
        ''' </summary>
        <LoadColumn(4)>
        Public Label As String
        
    End Class

    'Результат операции прогнозирования.
    Public Class IrisPrediction

        <ColumnName("PredictedLabel")>
        Public PredictedLabels As String

    End Class


    Sub Main(args As String())
        
        ' Шаг 2: Создание среды ML.NET 
        Dim mlContext As New MLContext()

        Dim reader As TextLoader = mlContext.Data.CreateTextLoader(Of IrisData)(separatorChar:=",", hasHeader:=False)
        Dim trainingDataView As IDataView = reader.Load("iris.data")
        Console.WriteLine($"Данные из файла ""iris.data"" прочитаны.")

        ' Шаг 3: Преобразуйте свои данные и добавьте learner:

        ' Присвойте числовые значения тексту в столбце "label", потому что только числа могут быть обработаны во время обучения модели.
        ' Добавьте обучающий алгоритм в pipeline. 
        ' Преобразовать label обратно в исходный текст (после преобразования в число на шаге 3).
        Dim pipeline As EstimatorChain(Of KeyToValueMappingTransformer) = mlContext.Transforms.Conversion.MapValueToKey("Label") _
            .Append(mlContext.Transforms.Concatenate("Features", "SepalLength", "SepalWidth", "PetalLength", "PetalWidth")) _
            .Append(mlContext.MulticlassClassification.Trainers.SdcaNonCalibrated("Label", "Features")) _
            .Append(mlContext.Transforms.Conversion.MapKeyToValue("PredictedLabel"))

        ' Шаг 4: Обучите модель на этом наборе данных:
        
        Console.WriteLine("Начато обучение модели.")
        Dim model As TransformerChain(Of KeyToValueMappingTransformer) = pipeline.Fit(trainingDataView)
        Console.WriteLine("Обучение модели завершено.")

		' Шаг 5: Используйте модель для предсказания:
        Do
            Console.WriteLine()
            Dim id As New IrisData()
            Console.Write("Длина чашелистника (sepal length) = ") 
            id.SepalLength = CSng(Console.ReadLine())
            Console.Write("Ширина чашелистника (sepal width) = ") 
            id.SepalWidth = CSng(Console.ReadLine())
            Console.Write("Длина лепестка (petal length) = ") 
            id.PetalLength = CSng(Console.ReadLine())
            Console.Write("Ширина лепестка (petal width) = ") 
            id.PetalWidth = CSng(Console.ReadLine())
            Dim prediction As IrisPrediction = GetPrediction(mlContext, model, id)
            Console.WriteLine($"Предсказанный тип цветка: {prediction.PredictedLabels}")
        Loop
    End Sub

    Private Function GetPrediction(mlContext As MLContext, model As TransformerChain(Of KeyToValueMappingTransformer), data As IrisData) As IrisPrediction
        Dim prediction As IrisPrediction = mlContext.Model.CreatePredictionEngine(Of IrisData, IrisPrediction)(model).Predict(data)
        Return prediction
    End Function

End Module

Запустим нашу программу с машинным обучением. Если задавать разные значения длины и ширины чашелистника и лепестка ириса, то увидим примерно следующее:

Результат работы алгоритма машинного обучения на ML.NET и Visual Basic
Результат работы алгоритма машинного обучения на ML.NET и Visual Basic

Как видно, модель обучилась на тестовых данных, и теперь мы можем по данным о длине и ширине чашелистника и лепестка с определённой вероятностью предсказывать вид ириса.

Последнее изменениеСуббота, 15 Август 2020 20:26 Прочитано 6105 раз

Поблагодарить автора:

Поделиться

Print Friendly, PDF & Email

2 комментарии

  • Сергей Ш.
    Сергей Ш. 19.03.2021 11:14 Комментировать

    Сколько не запускал программу все время выдаёт один и тот же результат:Iris-virginica

  • Aave1
    Aave1 20.03.2021 05:35 Комментировать

    Сергей! Возможно, те параметры цветка, которые вы вводили, как раз и соответствуют Iris-virginica. Потому что у меня они менялись, как показано на скриншоте.

Оставить комментарий