Главная страница
Навигация по странице:

  • Предобработка данных

  • Однослойные нейронные сети

  • Многослойные нейронные сети

  • Обучение нейронной сети

  • for

  • Сравнение результатов и производительности

  • Время, с Обучающая выборка Тестовая выборка Обучающая выборка

  • Лабораторная работа 7 Нейронные сети Бизнесзадача Рассмотрим задачу распознавания рукописных цифр. Бизнесзадача


    Скачать 1.01 Mb.
    НазваниеЛабораторная работа 7 Нейронные сети Бизнесзадача Рассмотрим задачу распознавания рукописных цифр. Бизнесзадача
    Дата19.11.2021
    Размер1.01 Mb.
    Формат файлаpptx
    Имя файлаLab7.pptx
    ТипЛабораторная работа
    #276332

    Лабораторная работа № 7 Нейронные сети

    Бизнес-задача

    Рассмотрим задачу распознавания рукописных цифр.

    Бизнес-задача

    • Какими данными мы можем располагать?

    Набор данных MNIST*

    Рассмотрим задачу распознавания рукописных цифр на примере набора данных MNIST.

    MNIST состоит из 70 000 полутоновых черно-белых изображений размера 28х28, содержащих одну рукописную цифру. Набор данных разделен на обучающую (60 000 изображений) и тестовую выборку (10 000 изображений).

    Интенсивность каждого пикселя изображения меняется в диапазоне от 0 до 255 (где 0 - белый, а 255 - черный).


    * http://yann.lecun.com/exdb/mnist

    Предобработка данных


    import numpy as np import idx2numpy X_train = idx2numpy.convert_from_file('train-images.idx3-ubyte') y_train = idx2numpy.convert_from_file('train-labels.idx1-ubyte') X_test = idx2numpy.convert_from_file('t10k-images.idx3-ubyte') y_test = idx2numpy.convert_from_file('t10k-labels.idx1-ubyte')

    X_train = np.reshape(X_train, (60000, 784)) X_test = np.reshape(X_test, (10000, 784)) X_train / 255.0

    X_test / 255.0

    Будем рассматривать каждое изображение как объект с 784 стандартизованными на [0,1] признаками.

    Нейронные сети


    Для решения задачи распознавания рукописных цифр построим с помощью искусственной нейронной сети классификатор, который возвращает в качестве значения класса значение распознанной цифры.

    Однослойные нейронные сети


    входной

    слой

    выходной

    слой

    функция активации

    нейрон

    Примеры функции активации

    • – линейная функция
    • – пороговая функция Хевисайда
    • – логистическая функция
    • – гиперболический тангенс
    • – гауссова функция
    • – функция softmax

    Многослойные нейронные сети


    входной слой

    выходной слой

    скрытые слои

    Обучение нейронной сети

    Для обучения классификатора (нахождения оптимальных значений всех весов ) с помощью нейронной сети необходимо задать:

    Обучение нейронной сети

    Для обучения нейронной сети обычно используется метод обратного распространения ошибки (backpropagation). 

    Используя обучающую выборку , найдем для заданной сети оптимальные значения весов .

    Зафиксируем объект .

    .

    function Backpropagation(,, )

    1) Инициализировать веса для всех

    2) для всех

    3)

    4) выбрать случайным образом из обучающей выборки

    5) для всех ;

    6) ;

    7)

    8)

    9) until не выполнен критерий останова

    Нейронные сети (DAAL)


    from daal.algorithms.neural_networks import training, prediction, initializers, layers from daal.algorithms.neural_networks.layers import fullyconnected, loss from daal.algorithms.neural_networks.initializers import uniform from daal.algorithms.neural_networks.layers.loss import softmax_cross

    def configureNet(): # топология 1-слойной нейронной сети с softmax функцией активации topology = training.Topology()

    fullyConnectedLayer = layers.fullyconnected.Batch(10) # выходной слой состоит из 10 нейронов

    fullyConnectedLayer.parameter.weightsInitializer = initializers.uniform.Batch(-0.01, 0.01) # инициализация весов связей при fullyConnectedLayer.parameter.biasesInitializer = initializers.uniform.Batch(-0.1, 0.1) #помощи равномерного распределения topology.push_back(fullyConnectedLayer)

    softmaxCrossEntropyLayer = layers.loss.softmax_cross.Batch() # функция потерь - перекрестная энтропия topology.push_back(softmaxCrossEntropyLayer)

    for index in range(topology.size()-1): topology.get(index).addNext(index + 1) #задание последовательности слоев в сети return topology

    Задание топологии нейронной сети:

    Нейронные сети (DAAL)


    from daal.algorithms import optimization_solver

    def trainModel(trainingData, trainingGroundTruth): net = training.Batch() net.initialize(trainingData.getDimensions(), configureNet()) net.input.setInput(training.data, trainingData) net.input.setInput(training.groundTruth, trainingGroundTruth)

    # использование стохастического градиентного спуска для обучения сети sgdAlgorithm = optimization_solver.sgd.Batch(fptype=np.float32) sgdAlgorithm.parameter.nIterations = 300 # максимальное число итераций net.parameter.optimizationSolver = sgdAlgorithm return net.compute().get(training.model).getPredictionModel_Float32()

    Обучение нейронной сети:

    Нейронные сети (DAAL)


    def testModel(predictionModel, predictionData): net = prediction.Batch() net.input.setModelInput(prediction.model, predictionModel) net.input.setTensorInput(prediction.data, predictionData) return net.compute()

    Тестирование обученной нейронной сети:

    Полносвязные нейронные сети (Scikit-learn)


    from sklearn.neural_network import MLPClassifier

    mlp = MLPClassifier(hidden_layer_sizes=(100,100), # создание полносвязной нейронной сети с двумя скрытыми слоями размера 100

    activation='identity', # использование линейной функции активации для всей сети alpha=0.0, # коэффициент -регуляризатораsolver='sgd', # для обучения сети используется стохастический градиентный спуск max_iter=300, # максимальное число итераций batch_size=200, # количество объектов, рассматриваемых в течение одной итерации tol=1e-4, # точность решения. learning_rate_init=0.001, # темп обученияrandom_state=10, # начальное состояние генератора случайных чисел verbose=True) # отображение состояния вычислений

    mlp.fit(trainX, trainY)

    Сравнение результатов и производительности


    Нейронная сеть

    Функция активации

    DAAL

    Scikit-learn

    Точность

    Время, с

    Точность

    Время, с

    Обучающая выборка

    Тестовая выборка

    Обучающая выборка

    Тестовая выборка

    2-слойная (100/10)

    линейная

    0.899

    0.904

    5.87

    0.929

    0.919

    56.95

    логистическая

    0.868

    0.880

    5.74

    0.99997

    0.979

    137.20

    3-слойная (100/100/10)

    линейная

    0.893

    0.895

    5.75

    0.924

    0.914

    44.67

    логистическая

    0.757

    0.763

    5.71

    1.000

    0.980

    113.28

    4-слойная (100/100/100/ 10)

    линейная

    0.889

    0.890

    5.91

    0.922

    0.915

    27.57

    логистическая

    0.356

    0.352

    5.94

    0.99998

    0.976

    108.51

    Практическое задание

    1. Сравните точность классификации нейронной сети с различными нелинейными функциями активации с точностью классификации нейронной сети с линейной функцией активации.

    2. Для двуслойной нейронной сети с фиксированной функцией активации постройте график зависимости времени обучения нейронной сети и точности классификации от количества нейронов в скрытом слое сети.

    3. Постройте график зависимости времени обучения нейронной сети и точности классификации от количества скрытых слоев (все скрытые слои одинакового размера) для многослойной нейронной сети с фиксированной функцией активации.

    Практическое задание

    4. Реализуйте в Python метод обратного распространения ошибки. Сравните различные показатели работы реализованного метода с алгоритмами обучения нейронных сетей в DAAL и Scikit-learn :

    а) найденные веса связей

    б) значение функции потерь для найденных весов

    в) время обучения нейронной сети

    г) точность построенных классификаторов



    написать администратору сайта