- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在学习神经网络,特别是研究具有反向传播实现的 MLP。我正在尝试用 python 实现我自己的网络,我想在开始之前我会看看其他一些库。经过一番搜索后,我找到了 Neil Schemenauer 的 python 实现 bpnn.py。 ( http://arctrix.com/nas/python/bpnn.py )
在完成代码并阅读了 Christopher M. Bishops 书的第一部分“模式识别的神经网络”后,我在 backPropagate 函数中发现了一个问题:
# calculate error terms for output
output_deltas = [0.0] * self.no
for k in range(self.no):
error = targets[k]-self.ao[k]
output_deltas[k] = dsigmoid(self.ao[k]) * error
Bishops 书中计算误差的代码行不同。在第 145 页的等式 4.41 中,他将输出单位误差定义为:
d_k = y_k - t_k
其中 y_k 是输出,t_k 是目标。 (我用_代表下标)所以我的问题是这行代码应该:
error = targets[k]-self.ao[k]
事实上:
error = self.ao[k] - targets[k]
我很可能完全错了,但请有人帮我解惑。谢谢
最佳答案
这完全取决于您使用的误差度量。举几个错误测量的例子(为简洁起见,我将使用 ys
表示 n
输出的向量,使用 ts
表示n
目标的向量):
mean squared error (MSE):
sum((y - t) ** 2 for (y, t) in zip(ys, ts)) / n
mean absolute error (MAE):
sum(abs(y - t) for (y, t) in zip(ys, ts)) / n
mean logistic error (MLE):
sum(-log(y) * t - log(1 - y) * (1 - t) for (y, t) in zip(ys, ts)) / n
您使用哪个完全取决于上下文。 MSE 和 MAE 可用于目标输出可以取任何值的情况,当目标输出为 0
或 1
以及 时,MLE 会给出非常好的结果y
在 open 范围内 (0, 1)
。
话虽如此,我还没有看到以前使用过的错误 y - t
或 t - y
(我自己在机器学习方面不是很有经验)。据我所知,您提供的源代码没有平方差或使用绝对值,您确定书上也没有吗?我对 y - t
或 t - y
的看法不是很好的错误度量,原因如下:
n = 2 # We only have two output neurons
ts = [ 0, 1 ] # Our target outputs
ys = [ 0.999, 0.001 ] # Our sigmoid outputs
# Notice that your outputs are the exact opposite of what you want them to be.
# Yet, if you use (y - t) or (t - y) to measure your error for each neuron and
# then sum up to get the total error of the network, you get 0.
t_minus_y = (0 - 0.999) + (1 - 0.001)
y_minus_t = (0.999 - 0) + (0.001 - 1)
编辑:根据 alfa's comment ,在书中,y - t
其实就是MSE的导数。在这种情况下,t - y
是不正确的。但是请注意,MSE 的实际导数是 2 * (y - t)/n
,而不仅仅是 y - t
。
如果您不除以 n
(因此您实际上得到的是平方和误差 (SSE),而不是均方误差),那么导数将为 2 * (y - t)
。此外,如果您使用 SSE/2
作为误差度量,则导数中的 1/2
和 2
抵消,您是留下 y - t
。
关于Python 神经网络反向传播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16342591/
我能否获得一个具有两个参数的递归Prolog谓词,称为反向,它返回列表的反向: 示例查询和预期结果: α-反向([a,b,c],L)。 L = [c,b,a]。 由两个称为palindrome的参数组
在使用 get_dummies() 将分类数据转换为数字数据后,我的数据框看起来像这样 score1 score2 country_CN country _AU category_leader ca
我有一张 table ,上面有一个国家/地区列表。说这些国家之一是“马其顿” 如果搜索“马其顿共和国”,什么 SQL 查询会返回“马其顿”记录? 我相信在 linq 中它会是这样的 var count
我们有一个角色继承结构,它假设每个人都默认获得最低级别的角色,而不是最高级别的过滤,如下图所示: role.Everyone //lowest level; everyone gets this ro
我正在使用 $.each() 解析数组,但在其中,我使用 .splice() 方法,因此我需要向后迭代。这可能吗? var store = [...]; //... var rules = [...]
我有一个 SPLObjectStorage 对象,其中 Player 对象作为键,分数作为与之关联的信息。玩家对象按照从最高分到最低分的顺序添加到存储中,但我现在需要以相反的顺序遍历它们。 我还需要能
我无法理解这一点:如果我给 Prolog reverse([], A). 它工作得很好,如果我给它 reverse(A, [] ). 并根据第一个建议回答 ; 它挂起!为什么? (GNU Prolog
我有一个 SPLObjectStorage 对象,其中 Player 对象作为键,分数作为与之关联的信息。玩家对象按照从最高分到最低分的顺序添加到存储中,但我现在需要以相反的顺序遍历它们。 我还需要能
我有一个HashMap看起来像: HashMap playerHashMap = new HashMap<>(); 玩家是包含姓名、号码、年龄等的对象。 现在我已经对它进行了排序,它看起来像这样: k
我有这个: file://localhost/Volumes/Untitled%20RAID%20Set%201/Callum/iTunes/Music/Steppenwolf/Steppenwolf
我正在使用 std::regex 并希望找到与某个用户定义的正则表达式字符串匹配的字符串中的最后一个位置。 例如,给定正则表达式 :.* 和字符串“test:55:last”,我想找到“:last”,
有一个表 ServErog(服务),它被重新引导到 4 个表 ServA、ServB、ServC、ServD(它们是不同的非统一服务),其中包含 servtype(服务类型)和 type_id(来自其
这个问题在这里已经有了答案: What is the best way to convert date from JavaScript string in format YYYYMMDD to Ja
我知道如何获得包含几个词的所有结果: SELECT * FROM `table` WHERE MATCH (`row`) AGAINST ('+word1 +word2' IN BOOLEAN MOD
你好,我有这个 html 代码: .container{ width: 450; height: 400; border:1px solid
我想知道是否有任何方法可以使用相同的 CSS 过渡实例来将其向前移动然后向后/向后移动。例如,假设我有这种转变: @-webkit-keyframes fade-transition { fr
假设我有这些字符串: char ref[30] = "1234567891234567891"; char oth[30] = "1234567891234567891"; 我想在 C++ 中使用 S
所以我有这段代码,它使 xcode 崩溃 void strrev(const std::string& str) { for(size_t i=str.length();i>=0;i--)
我正在使用下面的代码使每张图片 1 对 1 淡入淡出。我怎样才能反向执行此操作以使图片以相反的顺序加载? img {display:none;} $('img').each(function(
我正在尝试弄清楚如何改变 FrameLayout 堆叠其子项的方式。 目前它是最新的(先进先出)。我想更改它,使最新的 child 位于底部(FILO)。我试着查看 FrameLayout 的源代码,
我是一名优秀的程序员,十分优秀!