我碰到一些不同的错误计算功能来进行反传:方误差函数从http://mattmazur.com/2015/03/17/a-step-by-step-backpropagation-example/
Error = Output(i) * (1 - Output(i)) * (Target(i) - Output(i))
Run Code Online (Sandbox Code Playgroud)
现在,我想知道还有多少,它对培训的影响有多大?
此外,由于我理解第二个例子使用了图层使用的激活函数的导数,第一个例子是否也以某种方式执行此操作?对于任何损失函数(如果还有更多),它会是真的吗?
最后,如何知道使用哪一个,何时使用?
我正在研究用于 CNN 的模糊卷积滤波器。我已经准备好了函数 - 它接受 2D 输入矩阵和 2D 核/权重矩阵。该函数输出卷积特征或激活图。
现在,我想使用 Keras 构建 CNN 的其余部分,这些 CNN 也将具有标准的 2D 卷积滤波器。
有什么方法可以将我的自定义过滤器插入到 Keras 模型中,使内核矩阵由 Keras 后端的内置库更新?或者,是否有任何库可用于在每次迭代时更新内核?
python backpropagation gradient-descent conv-neural-network keras
我正在尝试对我的神经网络实施小批量训练,而不是更新每个训练样本权重的“在线”随机方法。
\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\nvoid 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) 我有一个由一些密集层组成的 Keras Sequential 模型。我将整个模型的可训练属性设置为 False。但是我看到各个层的可训练属性仍然设置为 True。我是否需要单独将图层的可训练属性也设置为 False?那么在整个模型上将trainable property设置为False是什么意思呢?
因此,我对 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) 我希望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 存储库中的源代码。
我昨天发布了这个问题,询问我的神经网络(我通过使用随机梯度下降的反向传播进行训练)是否陷入局部最小值.以下论文讨论了XOR神经网络中局部最小值的问题.第一个说没有局部最小值的问题,而下一篇论文(一年后写的)说在2-3-1 XOR神经网络中存在局部最小值的问题(作为除此之外,我在输入和隐藏层使用3-3-1即偏差.这两个都是摘要(我无法访问完整的论文,所以我无法阅读它):
还有另一篇论文[PDF]说最简单的XOR网络没有局部最小值,但它似乎没有谈论2-3-1网络.
现在谈到我的实际问题:我找不到任何讨论激活函数的选择,初始权重以及它对神经网络是否会陷入局部最小值的影响.我问这个问题的原因是在我的代码中我尝试使用标准的sigmoid激活函数和双曲正切激活函数.我注意到在前者中,我只有大约20%的时间被卡住,而在后者中,我往往会更频繁地被卡住.每当我第一次初始化网络时,我也会随机化我的权重,所以我想知道某一组随机权重是否更容易让我的神经网络"卡住".
至于激活功能而言,由于错误最终与由激活函数产生的输出,我在想,有是一个效果(即误差表面的变化).然而,这仅仅是基于直觉,我更喜欢一个具体的答案(对于这两点:初始权重和激活函数的选择).
artificial-intelligence backpropagation neural-network gradient-descent minima
我有一个AI项目,它使用Backpropagation神经网络.
它训练了大约1个小时,并且已经训练了来自所有100个输入的60-70个输入.我的意思是,在反向传播的条件下,60-70输入是正确的.(受过训练的输入数量在60到70之间).
目前,已完成超过10000个时期,每个时期花费近0.5秒.
如果长时间离开它,如何知道神经网络是否能够成功训练?(或者它不能更好地训练?)
我知道这两个功能是火炬的向后传播和界面如下
updateGradInput(input, gradOutput)
accGradParameters(input, gradOutput, scale)
我感到困惑的是什么gradInput,并gradOutput真正在层意思.假设网络的成本是C一层L.难道gradInput和gradOutput层的L意思是d_C/d_input_L和d_C/d_output_L?
如果是这样,如何计算gradInput符合gradOutput?
而且,是否accGradParameters意味着积累d_C/d_Weight_L和d_C/d_bias_L?如果是这样,如何计算这些值?
backpropagation neural-network gradient-descent deep-learning torch
我在哪里可以找到Tensorflow(python API)中的反向传播(通过时间)代码?或者使用其他算法?
例如,当我创建LSTM网络时.
backpropagation ×10
python ×4
keras ×2
c ×1
derivative ×1
java ×1
keras-layer ×1
mini-batch ×1
minima ×1
pytorch ×1
softmax ×1
tensorflow ×1
torch ×1