Pybrain的神经网络没有学习

时间:2016-12-12 16:46:42

标签: python machine-learning neural-network pybrain

我使用pybrain构建了神经网络。 我想要做的是创建一个可以处理输入错误的字典。

我构建了规范化的数据集,创建了网络,用我的数据集训练它,直到收敛。

现在,当我测试它时,我的结果是随机的。我尝试了一些新的输入,以及用于训练网络的所有原始输入。什么都没有找到正确的解决方案。

提前致谢!

'''
Created on Dec 8, 2016

@author:
'''


from pybrain.structure import FeedForwardNetwork
from pybrain.structure import LinearLayer, SigmoidLayer
from pybrain.structure import FullConnection
from pybrain.datasets import SupervisedDataSet
from pybrain.supervised.trainers import BackpropTrainer
from pybrain.tools.shortcuts import buildNetwork
from pybrain.supervised.trainers import RPropMinusTrainer

num_of_definitions = 7

real_input = [["rouge", "red", "rot"],
              ["jelov", "yellow", "yelov"],
              ["wit", "white", "wajt"],
              ["green", "grun", "groen"],
              ["bleu,", "blue", "blau"],
              ["color", "couleur", "kleur"],
              ["brown", "bruin", "braun"]]

real_output = [["crvena"], ["zuta"], ["bijela"], 
               ["zelena"], ["plava"], ["boja"], ["smeda"]]


def normalize_polje(polje):
    novo_polje = [[]]
    for i in range(0, num_of_definitions):
        for j in range(0, len(polje[0])):
            novo_polje[i].append(normalize_string(polje[i][j]))
        novo_polje.append([])
    novo_polje.pop()
    return novo_polje


def normalize_string(st):
    d = 0.0

    for i in range(0, len(st)):
        d += ord(st[i]) / 122.0
    d /= len(st)
    return d


def output_appr(d):

    diff = 1.0
    t_diff = 0.0

    for i in range(0, len(output)):

        t_diff = abs(output[i][0] - d)

        if t_diff < diff:
            diff = t_diff
            index = i

    return real_output[index][0]


def input_appr(d):

    diff = 1.0
    index1 = 0
    index2 = 0

    for i in range(0, len(iinput)):
        for j in range(0, len(iinput[i])):
            t_diff = abs(iinput[i][j] - d)
            if t_diff < diff:
                diff = t_diff
                index1 = i
                index2 = j
    return real_input[index1][index2]


iinput = normalize_polje(real_input)
output = normalize_polje(real_output)

n = FeedForwardNetwork()

inLayer = LinearLayer(3)
hiddenLayer = SigmoidLayer(3)
outLayer = LinearLayer(1)

n.addInputModule(inLayer)
n.addModule(hiddenLayer)
n.addOutputModule(outLayer)

in_to_hidden = FullConnection(inLayer, hiddenLayer)
hidden_to_out = FullConnection(hiddenLayer, outLayer)

n.addConnection(in_to_hidden)
n.addConnection(hidden_to_out)

n.sortModules()

ds = SupervisedDataSet(3, 1)

for i in range(0, len(iinput)):
    ds.addSample(iinput[i], output[i])

trainer = BackpropTrainer(n, ds)
trainer.train()

epoch = 1

while True:
    error = trainer.train()
    print ("Epoch #" + str(epoch) + " Error: " + str(error))
    epoch += 1
    if epoch > 1000:
        print "No Solution found!"
        break
    if error < 0.001:
        print "Solution found!"
        break
    trainer.trainUntilConvergence()


for innput, expectedOutput in ds:
    print innput
    outputt = n.activate(innput)
    print outputt
    print "Input: {}, Got: {}".format(input_appr(innput[0]), output_appr(outputt))

print ""
tst_str = "redd"
novi = normalize_string(tst_str)
print tst_str, novi
lista = []
lista.append(novi)
lista.append(novi)
lista.append(novi)
print n.activate(lista)
print output_appr(n.activate(lista))
'''print n
print iinput
print output
print("dataset:" + str(len(ds)))
for inpt, target in ds:
   print inpt, target'''

0 个答案:

没有答案