标签: backpropagation

反向传播的不同损失函数

我碰到一些不同的错误计算功能来进行反传:方误差函数从http://mattmazur.com/2015/03/17/a-step-by-step-backpropagation-example/

在此输入图像描述

或者 BP损失函数推导的一个很好的解释

Error = Output(i) * (1 - Output(i)) * (Target(i) - Output(i))
Run Code Online (Sandbox Code Playgroud)

现在,我想知道还有多少,它对培训的影响有多大?

此外,由于我理解第二个例子使用了图层使用的激活函数的导数,第一个例子是否也以某种方式执行此操作?对于任何损失函数(如果还有更多),它会是真的吗?

最后,如何知道使用哪一个,何时使用?

backpropagation neural-network

3
推荐指数
1
解决办法
8167
查看次数

如何在基于 Keras 的 CNN 中包含自定义过滤器?

我正在研究用于 CNN 的模糊卷积滤波器。我已经准备好了函数 - 它接受 2D 输入矩阵和 2D 核/权重矩阵。该函数输出卷积特征或激活图。

现在,我想使用 Keras 构建 CNN 的其余部分,这些 CNN 也将具有标准的 2D 卷积滤波器。

有什么方法可以将我的自定义过滤器插入到 Keras 模型中,使内核矩阵由 Keras 后端的内置库更新?或者,是否有任何库可用于在每次迭代时更新内核?

python backpropagation gradient-descent conv-neural-network keras

3
推荐指数
2
解决办法
5374
查看次数

使用小批量时如何更新权重?

我正在尝试对我的神经网络实施小批量训练,而不是更新每个训练样本权重的“在线”随机方法。

\n\n

我用 C 开发了一个有点新手的神经网络,我可以调整每层的神经元数量、激活函数等。这是为了帮助我理解神经网络。我已经在 mnist 数据集上训练了网络,但需要大约 200 个 epoch 才能在训练集上实现 20% 的错误率,这对我来说非常糟糕。我目前正在使用在线随机梯度下降来训练网络。我想尝试的是使用小批量。我理解这样的概念:在将误差传播回去之前,我必须累积并平均每个训练样本的误差。当我想计算必须对权重进行的更改时,我的问题就出现了。为了更好地解释这一点,请考虑一个非常简单的感知器模型。一个输入,一个隐藏层,一个输出。为了计算我需要对输入和隐藏单元之间的权重进行的更改,我将使用以下方程:

\n\n

\xe2\x88\x82C/\xe2\x88\x82w1= \xe2\x88\x82C/\xe2\x88\x82O*\xe2\x88\x82O/\xe2\x88\x82h*\xe2\x88\x82h/\ xe2\x88\x82w1

\n\n

如果你进行偏导数,你会得到:

\n\n

\xe2\x88\x82C/\xe2\x88\x82w1=(输出预期答案)(w2)(输入)

\n\n

现在这个公式表示您需要将反向传播误差乘以输入。对于在线随机训练来说这是有意义的,因为每次权重更新您使用 1 个输入。对于小批量训练,您使用了许多输入,那么错误会乘以哪个输入?\n我希望您能帮助我。

\n\n
void propogateBack(void){\n\n\n    //calculate 6C/6G\n    for (count=0;count<network.outputs;count++){\n            network.g_error[count] = derive_cost((training.answer[training_current])-(network.g[count]));\n    }\n\n\n\n    //calculate 6G/6O\n    for (count=0;count<network.outputs;count++){\n        network.o_error[count] = derive_activation(network.g[count])*(network.g_error[count]);\n    }\n\n\n    //calculate 6O/6S3\n    for (count=0;count<network.h3_neurons;count++){\n        network.s3_error[count] = 0;\n        for (count2=0;count2<network.outputs;count2++){\n            network.s3_error[count] += (network.w4[count2][count])*(network.o_error[count2]);\n        }\n    }\n\n\n    //calculate 6S3/6H3\n    for (count=0;count<network.h3_neurons;count++){\n        network.h3_error[count] = (derive_activation(network.s3[count]))*(network.s3_error[count]);\n    }\n\n\n    //calculate 6H3/6S2\n    network.s2_error[count] = = 0;\n    for (count=0;count<network.h2_neurons;count++){\n        for (count2=0;count2<network.h3_neurons;count2++){ \n            network.s2_error[count] …
Run Code Online (Sandbox Code Playgroud)

c backpropagation neural-network mini-batch

3
推荐指数
1
解决办法
1702
查看次数

设置 Keras 模型可训练与使每一层可训练有什么区别

我有一个由一些密集层组成的 Keras Sequential 模型。我将整个模型的可训练属性设置为 False。但是我看到各个层的可训练属性仍然设置为 True。我是否需要单独将图层的可训练属性也设置为 False?那么在整个模型上将trainable property设置为False是什么意思呢?

python machine-learning backpropagation keras keras-layer

3
推荐指数
1
解决办法
708
查看次数

我怎样才能在反向传播中获取softmax输出的导数

因此,我对 ML 很陌生,并尝试创建一个简单的“库”,以便我可以了解有关神经网络的更多信息。

我的问题:根据我的理解,我必须根据每层的激活函数求导数,这样我就可以计算它们的增量并调整它们的权重等......

对于 ReLU、sigmoid、tanh,用 Java 实现它们非常简单(顺便说一句,这是我使用的语言)

但要从输出到输入,我必须从(显然)具有 softmax 激活函数的输出开始。

那么我是否也必须采用输出层的导数,或者它只适用于所有其他层?

如果我确实必须获得导数,我怎样才能在Java中实现导数呢?谢谢。

我已经阅读了很多关于 Softmax 算法导数的解释的页面,但它们对我来说真的很复杂,正如我所说,我刚刚开始学习 ML,我不想使用现成的库,所以在这里我是。

这是我存储激活函数的类。

public class ActivationFunction {

    public static double tanh(double val) {
        return Math.tanh(val);
    }

    public static double sigmoid(double val) {
        return 1 / 1 + Math.exp(-val);
    }

    public static double relu(double val) {
        return Math.max(val, 0);
    }

    public static double leaky_relu(double val) {
        double result = 0;
        if (val > 0) result = val;
        else result = val * 0.01;
        return result;
    } …
Run Code Online (Sandbox Code Playgroud)

java machine-learning derivative backpropagation softmax

3
推荐指数
1
解决办法
5297
查看次数

pytorch floor() 梯度法的梯度是什么?

我希望floor()在我的模型之一中使用方法。我想了解 pytorch 用它的梯度传播做了什么,因为它floor是一种不连续的方法。

如果没有定义渐变,我可以根据需要覆盖向后方法来定义我自己的渐变,但我想了解默认行为是什么以及如果可能的话相应的源代码。

import torch

x = torch.rand(20, requires_grad=True)
y = 20*x
z = y.floor().sum()
z.backward()
Run Code Online (Sandbox Code Playgroud)

x.grad 返回零。

z 有一个 grad_fn=

所以FloorBackward就是梯度法。但是没有参考FloorBackwardpytorch 存储库中的源代码。

python machine-learning backpropagation pytorch

3
推荐指数
1
解决办法
410
查看次数

激活函数和初始权重的选择是否与神经网络是否陷入局部最小值有关?

我昨天发布了这个问题,询问我的神经网络(我通过使用随机梯度下降的反向传播进行训练)是否陷入局部最小值.以下论文讨论了XOR神经网络中局部最小值的问题.第一个说没有局部最小值的问题,而下一篇论文(一年后写的)说在2-3-1 XOR神经网络中存在局部最小值的问题(作为除此之外,我在输入和隐藏层使用3-3-1即偏差.这两个都是摘要(我无法访问完整的论文,所以我无法阅读它):

还有另一篇论文[PDF]说最简单的XOR网络没有局部最小值,但它似乎没有谈论2-3-1网络.

现在谈到我的实际问题:我找不到任何讨论激活函数的选择,初始权重以及它对神经网络是否会陷入局部最小值的影响.我问这个问题的原因是在我的代码中我尝试使用标准的sigmoid激活函数和双曲正切激活函数.我注意到在前者中,我只有大约20%的时间被卡住,而在后者中,我往往会更频繁地被卡住.每当我第一次初始化网络时,我也会随机化我的权重,所以我想知道某一组随机权重是否更容易让我的神经网络"卡住".

至于激活功能而言,由于错误最终与由激活函数产生的输出,我在想,有一个效果(即误差表面的变化).然而,这仅仅是基于直觉,我更喜欢一个具体的答案(对于这两点:初始权重和激活函数的选择).

artificial-intelligence backpropagation neural-network gradient-descent minima

2
推荐指数
1
解决办法
878
查看次数

如何知道反向传播能否成功训练?

我有一个AI项目,它使用Backpropagation神经网络.

它训练了大约1个小时,并且已经训练了来自所有100个输入的60-70个输入.我的意思是,在反向传播的条件下,60-70输入是正确的.(受过训练的输入数量在60到70之间).

目前,已完成超过10000个时期,每个时期花费近0.5秒.

如果长时间离开它,如何知道神经网络是否能够成功训练?(或者它不能更好地训练?)

artificial-intelligence backpropagation

2
推荐指数
1
解决办法
2637
查看次数

如何在火炬中编写updateGradInput和accGradParameters?

我知道这两个功能是火炬的向后传播和界面如下 updateGradInput(input, gradOutput) accGradParameters(input, gradOutput, scale) 我感到困惑的是什么gradInput,并gradOutput真正在层意思.假设网络的成本是C一层L.难道gradInputgradOutput层的L意思是d_C/d_input_Ld_C/d_output_L

如果是这样,如何计算gradInput符合gradOutput

而且,是否accGradParameters意味着积累d_C/d_Weight_Ld_C/d_bias_L?如果是这样,如何计算这些值?

backpropagation neural-network gradient-descent deep-learning torch

2
推荐指数
1
解决办法
1929
查看次数

Tensorflow中的反向传播(通过时间)代码

我在哪里可以找到Tensorflow(python API)中的反向传播(通过时间)代码?或者使用其他算法?

例如,当我创建LSTM网络时.

python backpropagation tensorflow

2
推荐指数
1
解决办法
2719
查看次数