Нейронная сеть сообщает об одном и том же ответе для разных активаций

Я написал этот простой тест нейронных сетей Pybrain, но он работает не так, как я ожидал. Идея состоит в том, чтобы обучить его на наборе данных чисел до 4095 с классом для простых и не простых чисел.

#!/usr/bin/env python
# A simple feedforward neural network that attempts to learn Primes

from pybrain.datasets import ClassificationDataSet
from pybrain.tools.shortcuts import buildNetwork
from pybrain.supervised import BackpropTrainer

class PrimesDataSet(ClassificationDataSet):
    """ A dataset for primes """

    def generatePrimes(self, n):
        if n == 2:
            return [2]
        elif n < 2:
            return []
        s = range(3, n + 1, 2)
        mroot = n ** 0.5
        half = (n + 1) / 2 - 1
        i = 0
        m = 3
        while m <= mroot:
            if s[i]:
                j = (m * m - 3) / 2
                s[j] = 0
                while j < half:
                    s[j] = 0
                    j += m
            i = i + 1
            m = 2 * i + 3
        return [2] + [x for x in s if x]

    def binaryString(self, n):
        return "{0:12b}".format(n)

    def __init__(self):
        ClassificationDataSet.__init__(self, 12, 1)
        primes = self.generatePrimes(4095)
        for prime in primes:
            b = self.binaryString(prime).split()
            self.addSample(b, [1])
        for n in range(4095):
            if n not in primes:
                b = self.binaryString(n).split()
                self.addSample(b, [0])

def testTraining():
    d = PrimesDataSet()
    d._convertToOneOfMany()
    n = buildNetwork(d.indim, 12, d.outdim, recurrent=True)
    t = BackpropTrainer(n, learningrate = 0.01, momentum = 0.99, verbose = True)
    t.trainOnDataset(d, 100)
    t.testOnData(verbose=True)
    print "Is 7 prime? ",   n.activate(d.binaryString(7).split())
    print "Is 6 prime? ",   n.activate(d.binaryString(6).split())
    print "Is 100 prime? ", n.activate(d.binaryString(100).split())


if __name__ == '__main__':
    testTraining()

Не обращая внимания (пожалуйста) на вопрос, возможно ли это вообще, моя проблема в том, что последние три оператора печати, проверяющие, являются ли числа 7, 6 и 100 простыми, возвращают одно и то же:

Is 7 prime?  [ 0.34435841  0.65564159]
Is 6 prime?  [ 0.34435841  0.65564159]
Is 100 prime?  [ 0.34435841  0.65564159]

(или что-то подобное) Я интерпретирую эти результаты так, что нейронная сеть с вероятностью 65% предсказывает, что каждое из этих чисел является простым числом. Научилась ли моя нейросеть одинаково обрабатывать все входные данные, или я что-то делаю не так?


person lambda    schedule 10.10.2012    source источник


Ответы (1)


На самом деле похоже, что вы используете только один вход.

d.binaryString(7).split()

эквивалентно

"{0:12b}".format(7).split()

который оценивается как

['111'].

Я думаю, что вы имели в виду что-то вроде

[int(c) for c in "{0:012b}".format(7)]

результат которого

[0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1]

P.S. Всегда полезно проверить, что именно вы вводите в свою статистическую модель :)

person Qnan    schedule 11.10.2012
comment
Благодарю вас! Споткнулся на самом простом - даже не подумал проверить. - person lambda; 11.10.2012