|
Лабораторная работа 7 Нейронные сети Бизнесзадача Рассмотрим задачу распознавания рукописных цифр. Бизнесзадача
Лабораторная работа № 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 : а) найденные веса связей в) время обучения нейронной сети г) точность построенных классификаторов |
|
|