- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用具有 1 个隐藏层(2 个神经元)和 1 个输出神经元的神经网络来解决 XOR 问题。
这是我正在使用的代码。它包含主运行文件 xor.py,该文件创建 model.py 中定义的模型。每个神经元由neuron.py中的Neuron类定义
异或.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
神经元
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
最佳答案
我认为错误出在 Neuron.py 函数 update() 中。如果您将 self.bias += delta 更改为 self.bias -= delta ,它应该可以工作,至少对我来说是这样。否则,您将修改偏差以上升到误差表面上的最大值。
下面您可以看到 100000 个训练周期后的输出。
[0, 0] => 0.0174550173543
[0, 1] => 0.983899954593
[1, 0] => 0.983895388655
[1, 1] => 0.0164172288168
关于python - 使用多层感知器的 XOR 分类对于所有输入输出 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43390463/
我收到了一个充满详细信息的文件,必须将其提取并根据其各自的列存储到不同的对象数组中。棘手的是,并非所有线路都具有相同数量的数据。我可以读取文件,可以拆分它以及所有内容。 20005,Arsenal,M
本题与问题相关:如何检测intent(in)的违规子程序里面。但是我在相关问题Enforce intent(in) declared variables in Fortran as constant
我正在尝试用 Java 设计一个海里计算器。 我能够通过控制台创建和运行它,但我在学习如何在 JFrames 中执行它时遇到了麻烦。 我基本上想做的是: 有两个文本字段和一个按钮,一个文本字段英里,一
我有一个 Excel 文件,其中显示了一个表格,用户可以在其中更改字段的值。当此值更改时,另一个字段的值会自动更改,因为它具有以下公式: row 26 =IF(DWTDwt:
我已经成功地从 2 个文件中提取数据并将它们存储在各自类的数组对象中。这是我存储在数组对象中的一些数据: 2005,Arsenal,ManU,Arsenal,WestHam,Y,2,3,40000 2
谁能告诉我这段代码有什么问题?我总是打不开。 #include #include using namespace std; int main(){ fstream fs; fs.o
golang 的fmt 包实现了格式化I/O函数,类似于C的 printf 和 scanf 定义示例类型和变量 ?
我正在编写一个脚本,它将一个 UTF-16 编码的文本文件作为输入并输出一个 UTF-16 编码的文本文件。 use open "encoding(UTF-16)"; open INPUT, " in
我刚刚开始学习 Java,我想克服在尝试为这个“问题”创建 Java 程序时出现的障碍。这是我必须创建一个程序来解决的问题: Tandy 喜欢分发糖果,但只有 n 颗糖果。对于她给第 i 个糖果的人,
代码在一台服务器上运行,但在另一台服务器上运行不正常。尝试使用 jquery uploadify 上传大小约为 1 MB 的文件时出现此错误。 IO: Error #2038 尝试在 php.ini
认识文件 平时说的文件一般都是指存储在硬盘上的普通文件。 形如:txt文本、jpg图片、mp4视频、rar压缩包等这些文件都可以认为是普通文件。 它们都是在硬盘上存储的。 但是站在计算机专业术语的角度
是否可以同时使用 C++ 应用程序和 Java 应用程序读取和写入同一个文本文件,而不会向其中写入冲突的行/字符?我现在已经用两个 java 应用程序进行了测试,似乎可以从一个进程写入文件,即使另一个
我是一名优秀的程序员,十分优秀!