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

python_nn.png

Искусственные нейронные сети (ИНС) — математические модели, а также их программные или аппаратные реализации, построенные по принципу организации и функционирования биологических нейронных сетей — сетей нервных клеток живого организма.

ИНС представляют собой систему соединённых и взаимодействующих между собой простых процессоров (искусственных нейронов).

Нейронные сети не программируются в привычном смысле этого слова, они обучаются. Возможность обучения — одно из главных преимуществ нейронных сетей перед традиционными алгоритмами. wikipedia

Теория

Подробнее с нейронными сетями можно познакомится по следующим ссылкам:

Модули python для нейронных сетей

Простой пример

В качестве примера приведу простую нейроную сеть (простой персептрон), которая после обучения сможет распознавать летающие объекты, не все, а только чайку :), все остальные входные образы будут распознаваться как НЛО.

# encoding=utf8
import random

class NN:
    def __init__(self, threshold, size):
        """
        Установим начальные параметры.
        """
        self.threshold = threshold
        self.size = size
        self.init_weight()

def init_weight(self):
        """
        Инициализируем матрицу весов случайными данными.
        """

self.weights = [[random.randint(1, 10) for i in xrange(self.size)] for j in xrange(self.size)]

def check(self, sample):
        """
        Считаем выходной сигнал для образа sample. Если vsum > self.threshold то можно предположить, что в sample есть образ чайки.
        """

vsum = 0
        for i in xrange(self.size):
            for j in xrange(self.size):
                vsum += self.weights[i][j] * sample[i][j]

if vsum > self.threshold:
            return True
        else:
            return False

def teach(self, sample):
        """
        Обучение нейронной сети.
        """

for i in xrange(self.size):
            for j in xrange(self.size):
                self.weights[i][j] += sample[i][j]

nn = NN(20, 6)

# Обучаем нейронную сеть.

tsample1 = [
    [0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 1],
    [0, 0, 0, 0, 1, 0],
    [0, 1, 0, 1, 0, 0],
    [0, 0, 1, 0, 0, 0],
    [0, 0, 0, 0, 0, 0],
]
nn.teach(tsample1)

tsample2 = [
    [0, 0, 0, 0, 1, 0],
    [0, 0, 0, 1, 0, 0],
    [1, 0, 1, 0, 0, 0],
    [0, 1, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0],
]
nn.teach(tsample2)

tsample3 = [
    [0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 1, 0],
    [0, 0, 0, 1, 0, 0],
    [1, 0, 1, 0, 0, 0],
    [0, 1, 0, 0, 0, 0],
]
nn.teach(tsample3)

tsample4 = [
    [0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 1],
    [0, 0, 1, 0, 1, 0],
    [0, 0, 0, 1, 0, 0],
]
nn.teach(tsample4)

# Проверим что может нейронная сеть.

# Передадим образ чайки, который примерно похож на тот, про который знает персептрон. 
wsample1 = [
    [0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0],
    [0, 0, 0, 1, 0, 0],
    [1, 0, 1, 0, 0, 0],
    [0, 1, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0],
]

print u"чайка" if nn.check(wsample1) else u"НЛО"

# Передадим неизвестный образ. 
wsample2 = [
    [0, 0, 0, 0, 0, 0],
    [0, 0, 1, 0, 0, 0],
    [0, 0, 0, 1, 0, 0],
    [0, 0, 1, 0, 0, 0],
    [0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0],
]

print u"чайка" if nn.check(wsample2) else u"НЛО"

# Передадим образ чайки, который примерно похож на тот, про который знает персептрон. 
wsample3 = [
    [0, 0, 0, 0, 1, 0],
    [0, 1, 0, 1, 0, 0],
    [0, 0, 1, 0, 0, 0],
    [0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0],
]

print u"чайка" if nn.check(wsample3) else u"НЛО"

Результаты

# первый запуск 
чайка       # True
НЛО         # True
чайка       # True

# второй запуск 
НЛО         # False
НЛО         # True
чайка       # True

У приведенной реализации есть несколько слабостей, для данного примера вполне терпимых :) :

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

PS: Подсветка кода немного лагает, потому сорцы лучше смотреть в любимом текстовом редакторе.

Дополнительное чтиво

Теги: neural_network, Python

blog comments powered by Disqus