- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一个带有单个输出单元(二进制分类)的简单 MLP 实现。我需要它用于教学目的,所以我不能使用现有的实现:(
我设法创建了一个工作虚拟模型并实现了训练功能,但 MLP 没有收敛。事实上,输出单元的梯度在 epoch 中仍然很高,所以它的权重接近无穷大。
我的实现:
import numpy as np
from sklearn.metrics import confusion_matrix
from sklearn.metrics import classification_report
X = np.loadtxt('synthetic.txt')
t = X[:, 2].astype(np.int)
X = X[:, 0:2]
# Sigmoid activation function for output unit
def logistic(x):
return 1/(1 + np.exp(-x))
# derivative of the tanh activation function for hidden units
def tanh_deriv(x):
return 1 - np.tanh(x)*np.tanh(x)
input_num = 2 # number of units in the input layer
hidden_num = 2 # number of units in the hidden layer
# initialize weights with random values:
weights_hidden = np.array((2 * np.random.random( (input_num + 1, hidden_num + 1) ) - 1 ) * 0.25)
weights_out = np.array((2 * np.random.random( hidden_num + 1 ) - 1 ) * 0.25)
def predict(x):
global input_num
global hidden_num
global weights_hidden
global weights_out
x = np.append(x.astype(float), 1.0) # input to the hidden layer: features + bias term
a = x.dot(weights_hidden) # activations of the hidden layer
z = np.tanh(a) # output of the hidden layer
q = logistic(z.dot(weights_out)) # input to the output (decision) layer
if q >= 0.5:
return 1
return 0
def train(X, t, learning_rate=0.2, epochs=50):
global input_num
global hidden_num
global weights_hidden
global weights_out
weights_hidden = np.array((2 * np.random.random( (input_num + 1, hidden_num + 1) ) - 1 ) * 0.25)
weights_out = np.array((2 * np.random.random( hidden_num + 1 ) - 1 ) * 0.25)
for epoch in range(epochs):
gradient_out = 0.0 # gradients for output and hidden layers
gradient_hidden = []
for i in range(X.shape[0]):
# forward propagation
x = np.array(X[i])
x = np.append(x.astype(float), 1.0) # input to the hidden layer: features + bias term
a = x.dot(weights_hidden) # activations of the hidden layer
z = np.tanh(a) # output of the hidden layer
q = z.dot(weights_out) # activations to the output (decision) layer
y = logistic(q) # output of the decision layer
# backpropagation
delta_hidden_s = [] # delta and gradient for a single training sample (hidden layer)
gradient_hidden_s = []
delta_out_s = t[i] - y # delta and gradient for a single training sample (output layer)
gradient_out_s = delta_out_s * z
for j in range(hidden_num + 1):
delta_hidden_s.append(tanh_deriv(a[j]) * (weights_out[j] * delta_out_s))
gradient_hidden_s.append(delta_hidden_s[j] * x)
gradient_out = gradient_out + gradient_out_s # accumulate gradients over training set
gradient_hidden = gradient_hidden + gradient_hidden_s
print "\n#", epoch, "Gradient out: ",gradient_out,
print "\n Weights out: ", weights_out
# Now updating weights
weights_out = weights_out - learning_rate * gradient_out
for j in range(hidden_num + 1):
weights_hidden.T[j] = weights_hidden.T[j] - learning_rate * gradient_hidden[j]
train(X, t, 0.2, 50)
0 Gradient out: [ 11.07640724 -7.20309009 0.24776626]
Weights out: [-0.15397237 0.22232593 0.03162811]
1 Gradient out: [ 23.68791197 -19.6688382 -1.75324703]
Weights out: [-2.36925382 1.66294395 -0.01792515]
2 Gradient out: [ 79.08612305 -65.76066015 -7.70115262]
Weights out: [-7.10683621 5.59671159 0.33272426]
3 Gradient out: [ 99.59798656 -93.90973727 -21.45674943]
Weights out: [-22.92406082 18.74884362 1.87295478]
49 Gradient out: [ 107.89975864 -105.8654327 -104.69591522]
Weights out: [-1003.67912726 976.87213404 922.38862049]
最佳答案
我不认为您应该使用平方和误差函数进行二元分类。相反,您应该使用交叉熵误差函数,它基本上是一个似然函数。这样,您的预测与正确答案的时间越长,错误就会变得更加昂贵。请阅读 Christopher Bishop 的“模式识别和机器学习”中关于“网络训练”第 235 页的部分,这将为您提供有关如何在 FFNN 上进行监督学习的正确概述。
偏置单元非常重要,因此它们使传递函数成为可能。沿 x 曲线移动。权重将改变传递函数的陡峭程度。曲线。请注意偏差和权重之间的这种差异,因为它可以很好地理解为什么它们都需要出现在 FFNN 中。
关于backpropagation - 多层感知器实现 : weights go crazy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17991386/
我正在尝试使用反向传播实现两层感知器来解决奇偶校验问题。该网络有 4 个二进制输入,第一层有 4 个隐藏单元,第二层有 1 个输出。我正在使用 this供引用,但在收敛方面有问题。 首先,我会注意到我
我正在创建一个工具,用于根据过去的数据预测软件项目的时间和成本。该工具使用神经网络来做到这一点,到目前为止,结果很有希望,但我认为我可以通过改变网络的属性来做更多的优化。当涉及到这些设置时,似乎没有任
我已经实现了如本视频中所述的反向传播。 https://class.coursera.org/ml-005/lecture/51 这似乎已经成功完成,通过了梯度检查,并允许我训练MNIST数字。 但是
假设我想拥有通用的神经网络架构: ---> BinaryOutput_A / Input --> nnLayer -
出于学术目的,我正在尝试使用递归实现反向传播,但似乎我在某处出错了。已经修改它一段时间了,但要么根本没有学习到第二种模式,要么没有学习到第二种模式。 请让我知道哪里出错了。 (这是 javascrip
我正在编写一个带有单个输出单元(二进制分类)的简单 MLP 实现。我需要它用于教学目的,所以我不能使用现有的实现:( 我设法创建了一个工作虚拟模型并实现了训练功能,但 MLP 没有收敛。事实上,输出单
我在通过神经网络进行机器学习的一些概念上遇到了困难。其中之一是backpropagation 。权重更新方程中, delta_w = a*(t - y)*g'(h)*x t 是“目标输出”,在监督学习
我必须为学校项目创建一个 OCR 程序,因此我开始在维基百科的帮助下创建一个反向传播算法。为了训练我的网络,我使用了几天前提取的 MNIST 数据库,这样我就有了真实的图像文件。但现在误差始终约为 2
我正在尝试用 Java 实现前馈神经网络。我创建了三个类 NNeuron、NLayer 和 NNetwork。 “简单”的计算似乎很好(我得到了正确的总和/激活/输出),但在训练过程中,我似乎没有得到
我正在搞乱 Accord.NET 中的不同深度学习算法。我决定用我手边的光谱数据来做这件事。我使用 Accord 的统计工具箱对数据进行 PCA 转换,使其减少到 10 个数据点。然后严格按照教程进行
我正在构建一个神经网络来学习识别 MNIST 中的手写数字。我已经确认反向传播可以完美地计算梯度(梯度检查给出错误 < 10 ^ -10)。 看来,无论我如何训练权重,成本函数总是趋向于 3.24-3
这个问题与Neuroph有关Java 库。 我有以下程序创建一个多层感知器,其中包含一个包含 20 个节点的隐藏层。正在学习的函数是 x^2。使用反向传播学习规则。但是,从输出中可以明显看出,该程序似
作为项目的一部分,我在使用tensorflow_probability处理正态分布的梯度时遇到问题。为此,我创建了一个正态分布并从中抽取了样本。然后,该样本的 log_prob 将被输入优化器以更新网
我是一名优秀的程序员,十分优秀!