- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在 Python 3.4 中使用 numpy 和矩阵构建一个神经网络草图,以学习简单的 XOR。我的符号如下:
a 是神经元的事件
z 是一个神经元的输入
W 是一个权重矩阵,大小为 R^{#上一层的神经元数}x{#下一层的神经元数}
B 是偏置值的向量
在 python 中实现了一个非常简单的网络后,仅在单个输入向量上训练时一切正常。然而,当对 XOR 的所有四个训练示例进行训练时,误差函数表现出非常奇怪的行为(见图)并且网络的输出始终约为 0.5。更改网络大小、学习率或训练周期似乎没有帮助。
这是网络的代码:
import numpy as np
import time
import matplotlib.pyplot as plt
Js = []
start = time.time()
np.random.seed(2)
#Sigmoid
def activation(x, derivative = False):
if(derivative):
a = activation(x)
return a * (1 - a)
else:
return 1/(1+np.exp(-x))
def cost(output, target):
return (1/2) * np.sum((target - output)**2)
INPUTS = np.array([
[0, 1],
[1, 0],
[0, 0],
[1, 1],
])
TARGET = np.array([
[1],
[1],
[0],
[0],
])
"Hyper-Parameters"
# Layer Structure
LAYER = [2, 3, 1]
LEARNING_RATE = 0.1
ITERATIONS = int(1e3)
# Init Weights
W1 = np.random.rand(LAYER[0], LAYER[1])
W2 = np.random.rand(LAYER[1], LAYER[2])
# Init Biases
B1 = np.random.rand(LAYER[1], 1)
B2 = np.random.rand(LAYER[2], 1)
for i in range(0, ITERATIONS):
exampleIndex = i % len(INPUTS)
#exampleIndex = 2
"Forward Pass"
# Layer One Activity (Input layer)
A0 = np.transpose(INPUTS[exampleIndex:exampleIndex+1])
# Layer Two Activity (Hidden Layer)
Z1 = np.dot(np.transpose(W1), A0) + B1
A1 = activation(Z1)
# Layer Three Activity (Output Layer)
Z2 = np.dot(np.transpose(W2), A1) + B2
A2 = activation(Z2)
# Output
O = A2
# Cost J
# Target Vector T
T = np.transpose(TARGET[exampleIndex:exampleIndex+1])
J = cost(O, T)
Js.append(J)
print("J = {}".format(J))
print("I = {}, O = {}".format(A0, O))
"Backward Pass"
# Calculate Delta of output layer
D2 = (O - T) * activation(Z2, True)
# Calculate Delta of hidden layer
D1 = np.dot(W2, D2) * activation(Z1, True)
# Calculate Derivatives w.r.t. W2
DerW2 = np.dot(A1, np.transpose(D2))
# Calculate Derivatives w.r.t. W1
DerW1 = np.dot(A0, np.transpose(D1))
# Calculate Derivatives w.r.t. B2
DerB2 = D2
# Calculate Derivatives w.r.t. B1
DerB1 = D1
"Update Weights and Biases"
W1 -= LEARNING_RATE * DerW1
B1 -= LEARNING_RATE * DerB1
W2 -= LEARNING_RATE * DerW2
B2 -= LEARNING_RATE * DerB2
# Show prediction
print("Time elapsed {}s".format(time.time() - start))
plt.plot(Js)
plt.ylabel("Cost J")
plt.xlabel("Iterations")
plt.show()
我的实现中出现这种奇怪行为的原因可能是什么?
最佳答案
我认为您的成本函数正在跳跃,因为您在每个样本后执行权重更新。然而,您的网络仍然在训练正确的行为:
479997
J = 4.7222501603409765e-05
I = [[1]
[0]], O = [[ 0.99028172]]
T = [[1]]
479998
J = 7.3205311398742e-05
I = [[0]
[0]], O = [[ 0.01210003]]
T = [[0]]
479999
J = 4.577485181547362e-05
I = [[1]
[1]], O = [[ 0.00956816]]
T = [[0]]
480000
J = 4.726257702199439e-05
I = [[0]
[1]], O = [[ 0.9902776]]
T = [[1]]
成本函数表现出一些有趣的行为:训练过程达到一个点,成本函数中的跳跃将变得非常小。您可以使用下面的代码重现它(我只做了细微的改动;请注意,我训练了更多的时期):
import numpy as np
import time
import matplotlib.pyplot as plt
Js = []
start = time.time()
np.random.seed(2)
#Sigmoid
def activation(x, derivative = False):
if(derivative):
a = activation(x)
return a * (1 - a)
else:
return 1/(1+np.exp(-x))
def cost(output, target):
return (1/2) * np.sum((target - output)**2)
INPUTS = np.array([[0, 1],[1, 0],[0, 0],[1, 1]])
TARGET = np.array([[1],[1],[0],[0]])
"Hyper-Parameters"
# Layer Structure
LAYER = [2, 3, 1]
LEARNING_RATE = 0.1
ITERATIONS = int(5e5)
# Init Weights
W1 = np.random.rand(LAYER[0], LAYER[1])
W2 = np.random.rand(LAYER[1], LAYER[2])
# Init Biases
B1 = np.random.rand(LAYER[1], 1)
B2 = np.random.rand(LAYER[2], 1)
for i in range(0, ITERATIONS):
exampleIndex = i % len(INPUTS)
# exampleIndex = 2
"Forward Pass"
# Layer One Activity (Input layer)
A0 = np.transpose(INPUTS[exampleIndex:exampleIndex+1])
# Layer Two Activity (Hidden Layer)
Z1 = np.dot(np.transpose(W1), A0) + B1
A1 = activation(Z1)
# Layer Three Activity (Output Layer)
Z2 = np.dot(np.transpose(W2), A1) + B2
A2 = activation(Z2)
# Output
O = A2
# Cost J
# Target Vector T
T = np.transpose(TARGET[exampleIndex:exampleIndex+1])
J = cost(O, T)
Js.append(J)
# print("J = {}".format(J))
# print("I = {}, O = {}".format(A0, O))
# print("T = {}".format(T))
if ((i+3) % 20000 == 0):
print(i)
print("J = {}".format(J))
print("I = {}, O = {}".format(A0, O))
print("T = {}".format(T))
if ((i+2) % 20000 == 0):
print(i)
print("J = {}".format(J))
print("I = {}, O = {}".format(A0, O))
print("T = {}".format(T))
if ((i+1) % 20000 == 0):
print(i)
print("J = {}".format(J))
print("I = {}, O = {}".format(A0, O))
print("T = {}".format(T))
if (i % 20000 == 0):
print(i)
print("J = {}".format(J))
print("I = {}, O = {}".format(A0, O))
print("T = {}".format(T))
"Backward Pass"
# Calculate Delta of output layer
D2 = (O - T) * activation(Z2, True)
# Calculate Delta of hidden layer
D1 = np.dot(W2, D2) * activation(Z1, True)
# Calculate Derivatives w.r.t. W2
DerW2 = np.dot(A1, np.transpose(D2))
# Calculate Derivatives w.r.t. W1
DerW1 = np.dot(A0, np.transpose(D1))
# Calculate Derivatives w.r.t. B2
DerB2 = D2
# Calculate Derivatives w.r.t. B1
DerB1 = D1
"Update Weights and Biases"
W1 -= LEARNING_RATE * DerW1
B1 -= LEARNING_RATE * DerB1
W2 -= LEARNING_RATE * DerW2
B2 -= LEARNING_RATE * DerB2
# Show prediction
print("Time elapsed {}s".format(time.time() - start))
plt.plot(Js)
plt.ylabel("Cost J")
plt.xlabel("Iterations")
plt.savefig('cost.pdf')
plt.show()
为了减少成本函数的波动,人们通常在执行更新(一些平均更新)之前使用多个数据样本,但我发现这在仅包含四个不同训练事件的集合中很难做到。因此,总结这个相当长的答案:您的成本函数跳跃是因为它是针对每个示例计算的,而不是针对多个示例的平均值计算的。然而,网络输出很好地遵循了 XOR 函数的分布,所以你不需要改变它。
关于python - 简单的非面向对象神经网络的成本 "jumping",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43457429/
在 risc-v 规范中,它说 j 是 jal 的伪代码。我对它的工作原理感到困惑,因为 j (25 位立即数)和 jal (20 位立即数)的立即值范围不同 - 还有 jalr 带 12 位立即数。
希望这是我提出问题的正确位置。为什么不能使用这两个指令递归调用子例程? 提前致谢! 最佳答案 如果您“跳转并链接”,返回地址将存储在寄存器中。如果再次“跳转链接”,返回地址就会被新的地址覆盖,破坏原来
我正在尝试在运行服务器端口的数据库和另一台服务器之间创建一个 SSH 隧道,如下所示。 MySQL:3306 Server-A:3306 我想使用 Server-A:3306作为连接到数据库的数据库
我喜欢包含键:值的“跳转字典”的概念,其中值是函数。不过,我不确定我是否应该喜欢这个概念。 我想替换一长串 if if-else if 语句。 (我应该使用 switch 语句吗?) 有没有不用eva
我是 js 的新手我正在尝试通过 Prop isActive .但我收到一个错误。你们能告诉我为什么我会收到下面的错误代码吗?我在这一行收到了错误 import React from 'react'
我一直在创建自己的 UIControl 子类以用于我的调整 iDunnoU .我已经完成了 UIControl,但展开/折叠动画除外。这个动画的问题是它在展开/折叠时会向下/向上“跳跃”,而不是像我原
我正在尝试让相机在我的 LWJGL 程序中跳跃。我尝试编写一个 if/else 语句,它会说:“当你到达这个位置时,转到默认的起始位置。”到目前为止,它还在继续飞翔。这是我的代码: if (flyUp
在过去的一个半星期里,我一直在使用 Java 和 Swing 从头开始编写游戏。到目前为止,游戏运行一切顺利,除了一件事:跳跃。我正在尝试实现抛物线跳跃,以便玩家不只是向上传送一点点。相反,我希望
我如何处理 JuMP 中的稀疏矩阵? 例如,假设我想施加以下形式的约束: A * x == 0 哪里A是一个稀疏矩阵和 x变量向量。我假设 A 的稀疏性可以被利用来使优化更快。如何在 JuMP 中利用
我有一个文本字段,您通常在其中输入数字。但是,用户必须单击键盘上的数字按钮才能进入数字屏幕。有没有办法直接跳转到键盘上的屏幕并可以输入数字? 如有任何意见和建议,我们将不胜感激。 提前致谢。 最佳答案
粘性导航栏“跳跃” 我最近制作了一个导航栏,它在滚动时粘在屏幕顶部(进入网页时它从中间开始)。我是在 Mac 上做的,一切正常。但是,当在我的 Windows 桌面上进入网页时,整个导航栏要么跳动,跳
我有一个功能类似于 w3schools 的侧边栏,而 w3schools 的侧边栏显示相同的问题。侧边栏“跳跃”并在该区域留下难看的空间,当向下滚动页面和移动 chrome 的导航栏隐藏时,它在顶部留
我正在尝试创建一组在悬停时展开和收缩的 Font-Awesome 社交媒体图标。但是,当我停止将鼠标悬停在每个图标上时会出现问题,图标中间的图像会“跳跃”而不是像图标的其余部分那样平滑地折叠。这是代码
我的垂直自动滚动似乎在某些点不规律地停止,我想要一个平滑的滚动。其次,我希望垂直滚动自动重置(几乎无限循环或暗示它永无止境而不仅仅是跳跃)。我将如何着手完成这个?到目前为止,这是我的代码:http:/
我在 YouTube 上发布了一个视频,您可以在其中看到该问题。我放慢了视频速度,这样你就能真正看到跳跃。 链接:https://www.youtube.com/watch?v=17Wftj2-MRM
我在 Drupal 8 中构建了一个站点(但我认为这是一个 CSS 问题)。 当您重新加载页面时,页面“跳转”。它也会在您第一次访问时执行此操作,但如果您按“f5”,您会看得更清楚。我尝试删除 Log
如您所见,此背景将向下动画。我拥有我想要的一切正常工作,除了在动画完成后,它会跳转,这是我不想要的。我只希望它无休止地滚动而无需跳转到它。下面的 CodePen。 关于如何在大约 10 秒后继续滚动而
更新:这基本上是我想要的,但 div 固定在底部 - http://www.wduffy.co.uk/blog/wp-content/demos/jquery-scrolling-element/ 有
我正在 Python 3.4 中使用 numpy 和矩阵构建一个神经网络草图,以学习简单的 XOR。我的符号如下: a 是神经元的事件 z 是一个神经元的输入 W 是一个权重矩阵,大小为 R^{#上一
请原谅标题措辞不佳,希望我能在这里解释这个问题。 我用 jQuery 编写了一个简单的画廊控件,其中有六个图像和两个按钮控件,允许用户循环浏览整个图像集合。我的这部分工作正常,但是每当我单击一个按钮在
我是一名优秀的程序员,十分优秀!