Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Большие данные - лекция-2 - MNIST + nolearn + lasagne

3a855e4e8dd144b8942da2463831a067?s=47 Anton
February 20, 2019

Большие данные - лекция-2 - MNIST + nolearn + lasagne

Распознавание рукописных цифр - MNIST, Python, Nolearn, Lasagne

3a855e4e8dd144b8942da2463831a067?s=128

Anton

February 20, 2019
Tweet

Transcript

  1. MNIST — база данных рукописных цифр • Mixed National Institute

    of Standards and Technology • 60000 изображений для обучения • 10000 изображений для тестирования • 28x28 пикселей, оттенки серого • Эталонная задача для тестирования и сравнения алгоритмов машинного обучения • yann.lecun.com/exdb/mnist/
  2. yann.lecun.com/exdb/mnist/

  3. Предварительная подготовка

  4. Kaggle: Digit Recognizer • www.kaggle.com/c/digit-recognizer • Зарегистрироваться • => Data:

    Скачать датасет: • train.csv — обучающая выборка: 77Мб, 42000 образов • test.csv — выборка тестирования: 50Мб, 28000 образов
  5. Python nolearn • github.com/dnouri/nolearn/ • pythonhosted.org/nolearn/ • Обертка над некоторыми

    другими реализациями нейронных сетей • По идее, можно обойтись и без нее, но вроде как она даёт некоторые дополнительные удобства • Документации почти нет, но есть статьи с примерами • nolearn.dbn — deprecated: работает только на Python 2.7, причем только на старых версиях некоторых других библиотек • nolearn.lasagne (лазанья) — ok, будем использовать её
  6. Python nolearn • pythonhosted.org/nolearn/ • sudo apt-get install python-pip •

    sudo pip install nolearn или • pip install --user nolearn
  7. Взять lasagne из мастера • (в 2019 году) установка по

    умолчанию вытянет версии зависимостей с проблемами • Попытка запустить пример выдаст ошибку: ImportError: cannot import name downsample • Нужно поставить lasagne из мастера: pip install --upgrade https://github.com/Lasagne/Lasagne/archive/ma ster.zip • см: github.com/aigamedev/scikit- neuralnetwork/issues/235
  8. Этапы • Сбор данных, выбор параметров • Унификация данных: формат

    CSV • Структурирование и нормализация данных: значения параметров для обучения в диапазон [0,1] • Подбор параметров нейронной сети, обучение на обучающей выборке • Проверка обученной сети на контрольной тестовой выборке • Внедрение => продукт
  9. Посмотрим данные train.csv • cat train.csv | more label,pixel0,pixel1,pixel2...pixel783 1,0,0,0,...0,191,250,253,93,0,...0,0,0,0

    … 3,0,0,0,...21,130,190,254,254,...0,0,0,0 • 28*28=784
  10. None
  11. None
  12. Контрольная выборка test.csv • cat test.csv pixel0,pixel1,pixel2...pixel783 ... • Нет

    поля label
  13. Пишем код — нейронная сеть

  14. Вспомним структуру нейрона

  15. None
  16. Загрузить данные в таблицу # coding=utf-8 import csv import numpy

    as np # загрузка данных - cтроки в список with open('train.csv', 'rb') as f: data = list(csv.reader(f)) # список строк в двумерный массив значений, # срежем заголовок train_data = np.array(data[1:]) # если хотим сократить выборку ([индекс_начала:кол- во_элементов]): #train_data = np.array(data[1:1000]) digit-recognizer.py
  17. и нормализовать # метки - столбец 1 y = train_data[:,

    0].astype(np.int32) # данные - все остальные столбцы + # нормализация данных - перенос значений в диапазон [0,1] X = train_data[:, 1:].astype(np.float32) / 255.0
  18. и структурировать (для свёрточных слоёв так удобнее) # For convolutional

    layers, the default shape of data is bc01, # i.e. batch size x color channels x image dimension 1 x image dimension 2. # Therefore, we reshape the X data to -1, 1, 28, 28. X = X.reshape( -1, # number of samples, -1 makes it so that this number is determined automatically 1, # 1 color channel, since images are only black and white 28, # first image dimension (vertical) 28, # second image dimension (horizontal) )
  19. Создаём сеть: импорты from lasagne.layers import DenseLayer from lasagne.layers import

    InputLayer from lasagne.layers import DropoutLayer from lasagne.layers import Conv2DLayer from lasagne.layers import MaxPool2DLayer from lasagne.nonlinearities import softmax from lasagne.updates import adam from nolearn.lasagne import NeuralNet from nolearn.lasagne import TrainSplit from nolearn.lasagne import objective
  20. Создаём сеть: 784 входа (пиксели), 10 выходов (цифры) layers0 =

    [ # layer dealing with the input data (InputLayer, {'shape': (None, X.shape[1], X.shape[2], X.shape[3])}), # first stage of our convolutional layers (Conv2DLayer, {'num_filters': 96, 'filter_size': 5}), (Conv2DLayer, {'num_filters': 96, 'filter_size': 3}), (Conv2DLayer, {'num_filters': 96, 'filter_size': 3}), (Conv2DLayer, {'num_filters': 96, 'filter_size': 3}), (Conv2DLayer, {'num_filters': 96, 'filter_size': 3}), (MaxPool2DLayer, {'pool_size': 2}), # second stage of our convolutional layers (Conv2DLayer, {'num_filters': 128, 'filter_size': 3}), (Conv2DLayer, {'num_filters': 128, 'filter_size': 3}), (Conv2DLayer, {'num_filters': 128, 'filter_size': 3}), (MaxPool2DLayer, {'pool_size': 2}), # two dense layers with dropout (DenseLayer, {'num_units': 64}), (DropoutLayer, {}), (DenseLayer, {'num_units': 64}), # the output layer (DenseLayer, {'num_units': 10, 'nonlinearity': softmax}), ]
  21. Создаём сеть: настройки обучения net0 = NeuralNet( layers=layers0, max_epochs=10, update=adam,

    update_learning_rate=0.0002, objective_l2=0.0025, train_split=TrainSplit(eval_size=0.25), verbose=3 )
  22. Обучить сетку net0.fit(X, y)

  23. Тестовые данные # загрузить #with open('test.csv', 'rb') as f: with

    open('test-simple-digits-1and3.csv', 'rb') as f: data = list(csv.reader(f)) # нормализовать test_data = np.array(data[1:]).astype(np.float32) / 255.0
  24. Предсказание # сделать reshape такой же, # как для обучающей

    выборки X preds = net0.predict( test_data.reshape(-1, 1, 28, 28))
  25. Смотрим результат, печатаем на экран i = 1 for elem

    in preds: print('ImageId: ' + str(i) + ', Label: ' + str(elem)) i += 1
  26. Можно сохранить в файл (если хочется посоревноваться в kaggle) with

    open('result-test.csv', 'wb') as f: fieldnames = ['ImageId', 'Label'] writer = csv.DictWriter(f, fieldnames=fieldnames) writer.writeheader() i = 1 for elem in preds: writer.writerow({'ImageId': i, 'Label': elem}) i += 1
  27. python digit-recognizer.py • ~1Гб оперативки • ~30 мин на эпоху

    (на всей обучающей выборке*) • ~30 мин * 10 эпох = ~5 часов подождать • Можно в процессе обучения нажать ctrl+c, в таком случае процесс обучения прервется, но скрипт продолжит выполнение и предсказание все равно сработает на частично обучившейся сетке • * на моём ноуте
  28. # Neural Network with 753610 learnable parameters ## Layer information

    name size total cap.Y cap.X cov.Y cov.X filter Y filter X field Y field X ----------- -------- ------- ------- ------- ------- ------- ---------- ---------- --------- --------- input0 1x28x28 784 100.00 100.00 100.00 100.00 28 28 28 28 conv2d1 96x24x24 55296 100.00 100.00 17.86 17.86 5 5 5 5 conv2d2 96x22x22 46464 42.86 42.86 25.00 25.00 3 3 7 7 conv2d3 96x20x20 38400 33.33 33.33 32.14 32.14 3 3 9 9 conv2d4 96x18x18 31104 27.27 27.27 39.29 39.29 3 3 11 11 conv2d5 96x16x16 24576 23.08 23.08 46.43 46.43 3 3 13 13 maxpool2d6 96x8x8 6144 23.08 23.08 46.43 46.43 3 3 13 13 conv2d7 128x6x6 4608 35.29 35.29 60.71 60.71 6 6 17 17 conv2d8 128x4x4 2048 28.57 28.57 75.00 75.00 6 6 21 21 conv2d9 128x2x2 512 24.00 24.00 89.29 89.29 6 6 25 25 maxpool2d10 128x1x1 128 24.00 24.00 89.29 89.29 6 6 25 25 dense11 64 64 100.00 100.00 100.00 100.00 28 28 28 28 dropout12 64 64 100.00 100.00 100.00 100.00 28 28 28 28 dense13 64 64 100.00 100.00 100.00 100.00 28 28 28 28 dense14 10 10 100.00 100.00 100.00 100.00 28 28 28 28
  29. Explanation X, Y: image dimensions cap.: learning capacity cov.: coverage

    of image magenta: capacity too low (<1/6) cyan: image coverage too high (>100%) red: capacity too low and coverage too high
  30. epoch trn loss val loss trn/val valid acc dur -------

    ---------- ---------- --------- ----------- -------- 1 2.45938 1.27233 1.93297 0.91069 1508.73s 2 1.27440 0.98503 1.29377 0.95030 1366.66s 3 1.02536 0.85437 1.20013 0.96401 1374.90s 4 0.89554 0.77352 1.15774 0.97258 1365.43s 5 0.79959 0.70965 1.12674 0.97544 1362.57s 6 0.73014 0.66689 1.09484 0.97363 1370.72s 7 0.67124 0.62055 1.08167 0.97572 1364.34s 8 0.62733 0.57799 1.08537 0.97801 1367.12s 9 0.58208 0.53900 1.07992 0.98020 1409.27s 10 0.54768 0.50863 1.07677 0.98143 1385.89s Значения dur: на полной выборке
  31. Для цифр «1» и «3» на картинках выше ImageId: 1,

    Label: 1 ImageId: 2, Label: 3
  32. Бонус: визуализация обучающих данных import matplotlib.pyplot as plt figs, axes

    = plt.subplots(4, 4, figsize=(6, 6)) for i in range(4): for j in range(4): axes[j, i].imshow(-X[i + 4 * j].reshape(28, 28), cmap='gray', interpolation='none') axes[j, i].set_xticks([]) axes[j, i].set_yticks([]) axes[j, i].set_title("Label: {}".format(y[i + 4 * j])) axes[j, i].axis('off') plt.show()
  33. None
  34. Самостоятельно • Сохранить состояние сети в файл • Загрузить состояние

    сети из фала
  35. Лабораторная работа - 1 • Нарисовать картинку 28x28 в любом

    графическом редакторе • Сохранить как png (или любой другой формат со сжатием без потерь) в отдельный файл • Конвертировать картинку в файл CSV в формате MNIST (test.csv) при помощи Python (найти библиотеку для загрузки и манипулирования пикселями изображения) • Проверить, как обученная на MNIST сетка распознаёт ваши закорючки
  36. None
  37. Ссылки • THE MNIST DATABASE of handwritten digits. [yann.lecun.com/exdb/mnist/] •

    Kaggle. Digit Recognizer. Classify handwritten digits using the famous MNIST data. [www.kaggle.com/c/digit-recognizer] • Как начать работу в Kaggle: руководство для новичков в Data Science (MNIST+Nolearn+DBN). [habrahabr.ru/post/248395/] • Getting Started with Deep Learning and Python. [www.pyimagesearch.com/2014/09/22/getting-started-deep-learning- python/ ] • Tutorial: Training convolutional neural networks with nolearn (MNIST+Nolearn+Lasagne) [nbviewer.jupyter.org/github/dnouri/nolearn/blob/master/docs/notebook s/CNN_tutorial.ipynb] • Lasagne for Python Newbies [martin-thoma.com/lasagne-for-python-newbies/]