- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我创建了一个神经网络并尝试训练它,一切都很好,直到我添加了偏差。
根据我在训练时收集的信息,偏差会调整以向上或向下移动预期输出,并且权重倾向于帮助 YHat 模拟某些函数的值,因此对于两层网络:
output = tanh(tanh(X0W0 + b0)W1 + b1)
在实践中,我发现 W 将所有权重设置为接近 0,而 b 几乎与 Y 的训练输出相呼应。这本质上使输出完美地适合训练数据,但是当您为其提供不同类型的数据时它总是给出相同的输出。
这引起了相当大的困惑。我知道偏差的作用是向上或向下移动激活图,但在训练时,它似乎使神经网络的整个目的变得无关紧要。这是我的训练方法的代码:
def train(self, X, Y, loss, epoch=10000):
for i in range(epoch):
YHat = self.forward(X)
loss.append(sum(Y - YHat))
err = -(Y - YHat)
for l in self.__layers[::-1]:
werr = np.sum(np.dot(l.localWGrad, err.T), axis=1)
werr.shape = (l.height, 1)
l.adjustWeights(werr)
err = np.sum(err, axis=1)
err.shape = (X.shape[0], 1)
l.adjustBiases(err)
err = np.multiply(err, l.localXGrad)
以及调整权重和偏差的代码。 (注:epsilon是我的训练率,lambda是正则化率)
def adjustWeights(self, err):
self.__weights = self.__weights - (err * self.__epsilon + self.__lambda * self.__weights)
def adjustBiases(self, err):
a = np.sum(np.multiply(err, self.localPartialGrad), axis=1) * self.__epsilon
a.shape = (err.shape[0], 1)
self.__biases = self.__biases - a
这是我为这个网络所做的数学计算。
Z0 = X0W0 + b0
X1 = relu(Z0)
Z1 = X1W1 + b1
X2 = relu(Z1)
a = YHat-X2
#Note the second part is for regularisation
loss = ((1/2)*(a^2)) + (lambda*(1/2)*(sum(W1^2) + sum(W2^2)))
现在是衍生品
dloss/dW1 = -(YHat-X2)*relu'(X1W1 + b1)X1
dloss/dW0 = -(YHat-X2)*relu'(X1W1 + b1)W1*relu'(X0W0 + b0)X0
dloss/db1 = -(YHat-X2)*relu'(X1W1 + b1)
dloss/db0 = -(YHat-X2)*relu'(X1W1 + b1)W1*relu'(X0W0 + b0)
我猜我做错了什么,但我不知道它是什么。我尝试根据以下输入训练该网络
X = np.array([[0.0], [1.0], [2.0], [3.0]])
Xnorm = X / np.amax(X)
Y = np.array([[0.0], [2.0], [4.0], [6.0]])
Ynorm = Y / np.amax(Y)
我得到这个作为输出:
post training:
shape: (4, 1)
[[0. ]
[1.99799666]
[3.99070622]
[5.72358125]]
Expected:
[[0.]
[2.]
[4.]
[6.]]
这看起来很棒......直到您转发其他内容:
shape: (4, 1)
[[2.]
[3.]
[4.]
[5.]]
然后我得到:
shape: (4, 1)
[[0.58289512]
[2.59967085]
[4.31654068]
[5.74322541]]
Expected:
[[4.]
[6.]
[8.]
[10.]]
我想“也许这就是我听说过的邪恶的‘过度拟合’”,并决定添加一些正则化,但即使这样也不能真正解决问题,从逻辑角度来看,为什么会这样呢?将偏差设置为等于输出并使权重为零更快、更优化...有人可以解释我的想法出了什么问题吗?
这是训练后的网络结构,(请注意,如果将输出乘以训练 Y 的最大值,您将得到预期的输出:)
===========================NeuralNetwork===========================
Layers:
===============Layer 0 :===============
Weights: (1, 3)
[[0.05539559 0.05539442 0.05539159]]
Biases: (4, 1)
[[0. ]
[0.22897166]
[0.56300199]
[1.30167665]]
==============\Layer 0 :===============
===============Layer 1 :===============
Weights: (3, 1)
[[0.29443245]
[0.29442639]
[0.29440642]]
Biases: (4, 1)
[[0. ]
[0.13199981]
[0.32762199]
[1.10023446]]
==============\Layer 1 :===============
==========================\NeuralNetwork===========================
图 y = 2x 在 x=0 处有 y 截距交叉,因此所有偏差'为 0 是有意义的,因为我们没有向上或向下移动图......对吗?
感谢您阅读本文!
编辑:
这是损失图:
编辑2:
我只是尝试使用单个权重和输出来做到这一点,这是我得到的输出结构:
===========================NeuralNetwork===========================
Layers:
===============Layer 0 :===============
Weights: (1, 1)
[[0.47149317]]
Biases: (4, 1)
[[0. ]
[0.18813419]
[0.48377987]
[1.33644038]]
==============\Layer 0 :===============
==========================\NeuralNetwork===========================
对于这个输入:
shape: (4, 1)
[[2.]
[3.]
[4.]
[5.]]
我得到了这个输出:
shape: (4, 1)
[[4.41954787]
[5.53236625]
[5.89599366]
[5.99257962]]
什么时候应该是:
Expected:
[[4.]
[6.]
[8.]
[10.]]
请注意,偏差问题仍然存在,您可能会认为在这种情况下权重将为 2,而偏差将为 0。
最佳答案
从OP的问题中移走答案
事实证明我从未正确处理我的训练数据。输入向量:
[[0.0], [1.0], [2.0], [3.0]]
被归一化,我用这个向量除以输入中的最大值3,因此我得到
[[0.0], [0.3333], [0.6666], [1.0]]
对于输入 Y 训练向量,我有
[[0.0], [2.0], [4.0], [6.0]]
我愚蠢地决定对这个向量做同样的事情,但是Y的最大值为6:
[[0.0], [0.333], [0.666], [1.0]]
所以基本上我是在说“嘿网络,模仿我的输入”。这是我的第一个错误。第二个错误是由于对缩放的更多误解造成的。
虽然 1 是 0.333,并且 0.333*2 = 0.666,然后我将其乘以 y (6) 6*0.666 = 2 的最大值,但如果我用另一组数据再次尝试此操作,请说:
[[2.0], [3.0], [4.0], [5.0]]
2 将是 2/5 = 0.4 和 0.4*2 = 0.8,乘以 5 将是 2,但是在现实世界中,我们无法知道 5 是数据集的最大输出,因此我我想可能是 Y 训练的最大值,即 6,所以不是 2/5 = 0.4, 0.4*2 = 0.8 * 5,而是 2/5 = 0.4, 0.4*2 = 0.8 * 6 = 4.8 .
因此,我得到了一些奇怪的偏差和权重行为。因此,在基本上摆脱标准化之后,我可以自由调整超参数,现在作为基础训练数据的输出:
输入:
X:
[[0.]
[1.]
[2.]
[3.]]
我得到这个输出:
shape: (4, 1)
[[0.30926124]
[2.1030826 ]
[3.89690395]
[5.6907253 ]]
以及额外的测试数据(未经训练):
shape: (4, 1)
[[2.]
[3.]
[4.]
[5.]]
我得到这个输出:
shape: (4, 1)
[[3.89690395]
[5.6907253 ]
[7.48454666]
[9.27836801]]
所以现在我很高兴。我还将我的激活更改为leaky relu,因为它应该更好地拟合线性方程(我认为)。我确信,通过更多的测试数据和更多的超参数调整,它将是一个完美的选择。感谢大家的帮助。试图解释我的问题确实让事情变得更正确。
关于python - 神经网络偏差训练,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49118967/
这与 Payubiz payment gateway sdk 关系不大一体化。但是,主要问题与构建项目有关。 每当我们尝试在模拟器上运行应用程序时。我们得到以下失败: What went wrong:
我有一个现有的应用程序,其中包含在同一主机上运行的 4 个 docker 容器。它们已使用 link 命令链接在一起。 然而,在 docker 升级后,link 行为已被弃用,并且似乎有所改变。我们现
在 Internet 模型中有四层:链路 -> 网络 -> 传输 -> 应用程序。 我真的不知道网络层和传输层之间的区别。当我读到: Transport layer: include congesti
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
前言: 生活中,我们在上网时,打开一个网页,就可以看到网址,如下: https😕/xhuahua.blog.csdn.net/ 访问网站使用的协议类型:https(基于 http 实现的,只不过在
网络 避免网络问题降低Hadoop和HBase性能的最重要因素可能是所使用的交换硬件,在项目范围的早期做出的决策可能会导致群集大小增加一倍或三倍(或更多)时出现重大问题。 需要考虑的重要事项:
网络 网络峰值 如果您看到定期的网络峰值,您可能需要检查compactionQueues以查看主要压缩是否正在发生。 有关管理压缩的更多信息,请参阅管理压缩部分的内容。 Loopback IP
Pure Data 有一个 loadbang 组件,它按照它说的做:当图形开始运行时发送一个 bang。 NoFlo 的 core/Kick 在其 IN 输入被击中之前不会发送其数据,并且您无法在 n
我有一台 Linux 构建机器,我也安装了 minikube。在 minikube 实例中,我安装了 artifactory,我将使用它来存储各种构建工件 我现在希望能够在我的开发机器上做一些工作(这
我想知道每个视频需要多少种不同的格式才能支持所有主要设备? 在我考虑的主要设备中:安卓手机 + iPhone + iPad . 对具有不同比特率的视频进行编码也是一种好习惯吗? 那里有太多相互矛盾的信
我有一个使用 firebase 的 Flutter Web 应用程序,我有两个 firebase 项目(dev 和 prod)。 我想为这个项目设置 Flavors(只是网络没有移动)。 在移动端,我
我正在读这篇文章Ars article关于密码安全,它提到有一些网站“在传输之前对密码进行哈希处理”? 现在,假设这不使用 SSL 连接 (HTTPS),a.这真的安全吗? b.如果是的话,你会如何在
我试图了解以下之间的关系: eth0在主机上;和 docker0桥;和 eth0每个容器上的接口(interface) 据我了解,Docker: 创建一个 docker0桥接,然后为其分配一个与主机上
我需要编写一个java程序,通过网络将对象发送到客户端程序。问题是一些需要发送的对象是不可序列化的。如何最好地解决这个问题? 最佳答案 发送在客户端重建对象所需的数据。 关于java - 不可序列化对
所以我最近关注了this有关用 Java 制作基本聊天室的教程。它使用多线程,是一个“面向连接”的服务器。我想知道如何使用相同的 Sockets 和 ServerSockets 来发送对象的 3d 位
我想制作一个系统,其中java客户端程序将图像发送到中央服务器。中央服务器保存它们并运行使用这些图像的网站。 我应该如何发送图像以及如何接收它们?我可以使用同一个网络服务器来接收和显示网站吗? 最佳答
我正在尝试设置我的 rails 4 应用程序,以便它发送电子邮件。有谁知道我为什么会得到: Net::SMTPAuthenticationError 534-5.7.9 Application-spe
我正在尝试编写一个简单的客户端-服务器程序,它将客户端计算机连接到服务器计算机。 到目前为止,我的代码在本地主机上运行良好,但是当我将客户端代码中的 IP 地址替换为服务器计算机的本地 IP 地址时,
我需要在服务器上并行启动多个端口,并且所有服务器套接字都应在 socket.accept() 上阻塞。 同一个线程需要启动客户端套接字(许多)来连接到特定的 ServerSocket。 这能实现吗?
我的工作执行了大约 10000 次以下任务: 1) HTTP 请求(1 秒) 2)数据转换(0.3秒) 3)数据库插入(0.7秒) 每次迭代的总时间约为 2 秒,分布如上所述。 我想做多任务处理,但我
我是一名优秀的程序员,十分优秀!