Почему моя нейронная сеть показывает странные результаты?

Я создал простую нейронную сеть, используя PyBrain:

from pybrain.tools.shortcuts import buildNetwork
from pybrain.datasets import SupervisedDataSet
from pybrain.supervised.trainers import BackpropTrainer

    L_Z = [
    0b111111,
    0b000010,
    0b000100,
    0b001000,
    0b010000,
    0b111111
    ]

C_Z = [
    0b111111,
    0b100001,
    0b000110,
    0b000001,
    0b100001,
    0b111111
    ]

net = buildNetwork(6, 3, 1)


ds = SupervisedDataSet(6, 1)

ds.addSample(tuple(L_Z), (1,))
ds.addSample(tuple(C_Z), (0,))

trainer = BackpropTrainer(net, ds)
trainer.trainUntilConvergence()


print net.activate(L_Z)
print net.activate(C_Z)

Но после каждого запуска программы показывают разные результаты. Моя сеть должна научиться находить букву "Z" на английском языке и букву "Z" на кириллице. Что случилось?

2 ответа

Решение

Ваш подход в корне неверен. Сеть с 6 входами означает, что каждый вход представляет собой число с плавающей запятой, которое может изменяться от 0 до 1. PyBrain не сообщает вам, когда вы даете значения, которые являются слишком высокими или слишком низкими. Например, 0b111111 на самом деле 63. Если вы хотите, чтобы вход для каждой ячейки обнаружения, вам нужно было бы использовать сеть с 36 входами.

L_Z = [
    1,1,1,1,1,1,
    0,0,0,0,1,0,
    0,0,0,1,0,0,
    0,0,1,0,0,0,
    0,1,0,0,0,0,
    1,1,1,1,1,1
    ]

 C_Z = [
    1,1,1,1,1,1,
    1,0,0,0,0,1,
    0,0,0,1,1,0,
    0,0,0,0,0,1,
    1,0,0,0,0,1,
    1,1,1,1,1,1
    ]

 net = buildNetwork(36, 3, 1)


 ds = SupervisedDataSet(36, 1)

 ds.addSample(L_Z, [1])
 ds.addSample(C_Z, [0])

 trainer = BackpropTrainer(net, ds)

 for x in range(1000):
  trainer.train()

 print net.activate(L_Z)
 print net.activate(C_Z)

Я удивлен.trainUntilConvergeance() работает, обычно он откладывает 1/4 данных для проверки, если вы дадите ему только два примера, они обычно вылетят. В любом случае, этот код будет работать для достижения желаемого результата, но если вы пытаетесь использовать компьютерное зрение, они обычно используют комбинацию подходов для обнаружения вещей.

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

=> нейронная сеть со значениями a, b, c эквивалентна b, c, a или c, b, например a (грубо говоря)

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

Другие вопросы по тегам