【问题标题】:XOR classification using multilayer perceptrons is outputting 1 for all inputs使用多层感知器的 XOR 分类为所有输入输出 1
【发布时间】:2017-04-13 11:00:11
【问题描述】:

我正在使用具有 1 个隐藏层(2 个神经元)和 1 个输出神经元的神经网络来解决 XOR 问题。

这是我正在使用的代码。它包含主运行文件 xor.py,它创建在 model.py 中定义的模型。每个神经元由 neuron.py 中的 Neuron 类定义

xor.py

from model import Model
import numpy as np

inputs = [[0,0], [0,1], [1,0], [1,1]]
outputs = [0, 1, 1, 0]

m = Model()

m.train(inputs, outputs)

for i in inputs:
    p = m.predict(i)
    print str(i) + ' => ' + str(p)

模型.py

from neuron import HiddenNeuron, OutputNeuron
import numpy as np

    class Model(object):

    def __init__(self):
        self.hidden = [HiddenNeuron(2) for i in range(2)]
        self.output = OutputNeuron(2)

    def predict(self, input):
        temp = []
        for x in range(2):
            self.hidden[x].forward(input)
            temp.append(self.hidden[x].out)
        self.output.forward(temp)
        return self.output.out

    def train(self, inputs, targets):
        it = 0
        i = 0
        size = len(inputs)
        while it < 4:
            if i == size:
                i = 0
            feature = inputs[i]
            print '\n\nFeature : ' + str(feature) + '\n'
            print 'Output weights : ' + str(self.output.weights)
            print 'Hidden 1 weights : ' + str(self.hidden[0].weights)
            print 'Hidden 2 weights : ' + str(self.hidden[1].weights)
            temp = []
            for x in range(2):
                self.hidden[x].forward(feature)
                temp.append(self.hidden[x].out)
            self.output.forward(temp)
            self.output.backward(targets[i])
            deltas = []
            deltas.append(self.output.error)
            weights = []
            weights.append([self.output.weights[0]])
            weights.append([self.output.weights[1]])
            for x in range(2):
                self.hidden[x].backward(deltas, weights[x])
            for x in range(2):
                self.hidden[x].update(feature)
            self.output.update(temp)
            it += 1
            i += 1

神经元.py

import numpy as np
from random import uniform

class Neuron(object):

    def activation(self, fx):
        return 1/(1 + np.exp(-fx))

    def __init__(self, dim, lrate):
        self.dim = dim
        self.weights = np.empty([dim])
        self.weights = [uniform(0,1) for x in range(dim)]
        self.bias = uniform(0, 1)
        self.lrate = lrate
        self.out = None
        self.error = None

    def update(self, input):
        j = 0
        for i in input:
            delta = self.lrate * self.error
            self.weights[j] -= (delta*i)
            self.bias += delta
            j+=1

    def forward(self, input):
        j = 0
        sum = self.bias
        for f in input:
            sum += f * self.weights[j]
            j+=1
        self.out = self.activation(sum)

    def backward(self):
        pass

class OutputNeuron(Neuron):

    def __init__(self, dim, lrate=0.2):
        super(OutputNeuron, self).__init__(dim, lrate)

    def backward(self, target):
        self.error = self.out * (1 - self.out) * (self.out - target)


class HiddenNeuron(Neuron):

    def __init__(self, dim, lrate=0.2):
        super(HiddenNeuron, self).__init__(dim, lrate)

    def backward(self, deltas, weights):
        sum = 0
        size = len(deltas)
        for x in range(size):
            sum += deltas[x] * weights[x]
        self.error = self.out * (1 - self.out) * sum

最终的输出是

[0, 0] => 0.999999991272
[0, 1] => 0.999999970788
[1, 0] => 0.999999952345
[1, 1] => 0.999715564446

【问题讨论】:

    标签: python machine-learning neural-network xor


    【解决方案1】:

    我认为错误出现在函数 update() 中的 neuron.py 中。如果您将 self.bias += delta 更改为 self.bias -= delta 它应该可以工作,至少它对我有用。否则,您将修改您的偏差以在误差面上向最大值上升。

    您可以在下面看到 100000 个训练 epoch 后的输出。

    [0, 0] => 0.0174550173543 [0, 1] => 0.983899954593 [1, 0] => 0.983895388655 [1, 1] => 0.0164172288168

    【讨论】:

    • 你能告诉我为什么当我使用减号而不是加号时它会起作用吗?有什么我做错了吗?因为有时它不起作用。
    • 为了找到损失函数的(局部或全局)最小值,需要尽可能在误差面上下降。负梯度总是指向最陡下降的方向,所以你需要负值来更新负梯度方向的权重和偏差。在您的示例中,更新了权重以最小化损失函数,但更新了偏差以最大化损失函数,这会导致一些不良的网络行为。
    猜你喜欢
    • 2012-10-31
    • 2013-12-14
    • 2016-05-04
    • 2017-07-03
    • 2017-02-28
    • 2017-03-20
    • 2015-08-05
    • 2013-12-11
    • 2017-08-29
    相关资源
    最近更新 更多