- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试实现 SGD 功能以在 caffe python 中手动更新 python 中的权重,而不是使用 solver.step()
函数。目标是在执行 solver.step()
后通过手动更新权重来匹配权重更新。
设置如下:使用 MNIST 数据。将 solver.prototxt 中的随机种子设置为:random_seed: 52
。确保 momentum: 0.0
和 base_lr: 0.01
, lr_policy: "fixed"
。上面这样做是为了让我可以简单地实现 SGD 更新方程(没有动量、正则化等)。等式很简单:W_t+1 = W_t - mu * W_t_diff
以下是两个测试:
测试 1:使用caffe的forward()和backward()计算前向传播和反向传播。对于包含权重的每一层,我都这样做:
for k in weight_layer_idx:
solver.net.layers[k].blobs[0].diff[...] *= lr # weights
solver.net.layers[k].blobs[1].diff[...] *= lr # biases
接下来,将权重/偏差更新为:
solver.net.layers[k].blobs[0].data[...] -= solver.net.layers[k].blobs[0].diff
solver.net.layers[k].blobs[1].data[...] -= solver.net.layers[k].blobs[1].diff
我运行了 5 次迭代。
测试 2:运行 caffe 的 solver.step(5)
。
现在,我期望这两个测试在两次迭代后应该产生完全相同的权重。
我在上述每个测试后保存了权重值,并计算了两个测试的权重向量之间的范数差,我发现它们不是位精确的。有人能发现我可能遗漏的东西吗?
完整代码如下,供引用:
import caffe
caffe.set_device(0)
caffe.set_mode_gpu()
import numpy as np
niter = 5
solver = None
solver = caffe.SGDSolver('solver.prototxt')
# Automatic SGD: TEST2
solver.step(niter)
# save the weights to compare later
w_solver_step = copy(solver.net.layers[1].blobs[0].data.astype('float64'))
b_solver_step = copy(solver.net.layers[1].blobs[1].data.astype('float64'))
# Manual SGD: TEST1
solver = None
solver = caffe.SGDSolver('solver.prototxt')
lr = 0.01
momentum = 0.
# Get layer types
layer_types = []
for ll in solver.net.layers:
layer_types.append(ll.type)
# Get the indices of layers that have weights in them
weight_layer_idx = [idx for idx,l in enumerate(layer_types) if 'Convolution' in l or 'InnerProduct' in l]
for it in range(1, niter+1):
solver.net.forward() # fprop
solver.net.backward() # bprop
for k in weight_layer_idx:
solver.net.layers[k].blobs[0].diff[...] *= lr
solver.net.layers[k].blobs[1].diff[...] *= lr
solver.net.layers[k].blobs[0].data[...] -= solver.net.layers[k].blobs[0].diff
solver.net.layers[k].blobs[1].data[...] -= solver.net.layers[k].blobs[1].diff
# save the weights to compare later
w_fwdbwd_update = copy(solver.net.layers[1].blobs[0].data.astype('float64'))
b_fwdbwd_update = copy(solver.net.layers[1].blobs[1].data.astype('float64'))
# Compare
print "after iter", niter, ": weight diff: ", np.linalg.norm(w_solver_step - w_fwdbwd_update), "and bias diff:", np.linalg.norm(b_solver_step - b_fwdbwd_update)
将权重与两个测试进行比较的最后一行产生:
在 iter 5 之后:权重差异:0.000203027766144 和偏差差异:1.78390789051e-05
我希望这个差异为 0.0
有什么想法吗?
最佳答案
你几乎是对的,你只需要在每次更新后将差异设置为零。Caffe 不会自动执行此操作以让您有机会实现批处理累积(为一次权重更新累积多个批处理的梯度,如果您的内存不足以满足您所需的批处理大小,这会很有帮助)。
另一个可能的问题可能是 cudnn 的使用,它的卷积实现是不确定的(或者准确地说它是如何设置为在 caffe 中使用的)。通常,这应该没有问题,但在您的情况下,每次都会导致略有不同的结果,因此权重也不同。如果你用 cudnn 编译了 caffe,你可以简单地将模式设置为 cpu 以防止在测试时发生这种情况。
此外,求解器参数对权重更新有影响。如您所述,您应该注意:
在网络中,一定不要使用学习率乘数,通常学习偏差的速度是权重的两倍,但这不是您实现的行为。所以你需要确保在层定义中将它们设置为一个:
param {
lr_mult: 1 # weight lr multiplier
}
param {
lr_mult: 1 # bias lr multiplier
}
最后但同样重要的是,这里有一个例子,你的代码在使用动量、权重衰减和 lr_mult 时会是什么样子。在 CPU 模式下,这会产生预期的输出(无差异):
import caffe
caffe.set_device(0)
caffe.set_mode_cpu()
import numpy as np
niter = 5
solver = None
solver = caffe.SGDSolver('solver.prototxt')
# Automatic SGD: TEST2
solver.step(niter)
# save the weights to compare later
w_solver_step = solver.net.layers[1].blobs[0].data.copy()
b_solver_step = solver.net.layers[1].blobs[1].data.copy()
# Manual SGD: TEST1
solver = None
solver = caffe.SGDSolver('solver.prototxt')
base_lr = 0.01
momentum = 0.9
weight_decay = 0.0005
lr_w_mult = 1
lr_b_mult = 2
momentum_hist = {}
for layer in solver.net.params:
m_w = np.zeros_like(solver.net.params[layer][0].data)
m_b = np.zeros_like(solver.net.params[layer][1].data)
momentum_hist[layer] = [m_w, m_b]
for i in range(niter):
solver.net.forward()
solver.net.backward()
for layer in solver.net.params:
momentum_hist[layer][0] = momentum_hist[layer][0] * momentum + (solver.net.params[layer][0].diff + weight_decay *
solver.net.params[layer][0].data) * base_lr * lr_w_mult
momentum_hist[layer][1] = momentum_hist[layer][1] * momentum + (solver.net.params[layer][1].diff + weight_decay *
solver.net.params[layer][1].data) * base_lr * lr_b_mult
solver.net.params[layer][0].data[...] -= momentum_hist[layer][0]
solver.net.params[layer][1].data[...] -= momentum_hist[layer][1]
solver.net.params[layer][0].diff[...] *= 0
solver.net.params[layer][1].diff[...] *= 0
# save the weights to compare later
w_fwdbwd_update = solver.net.layers[1].blobs[0].data.copy()
b_fwdbwd_update = solver.net.layers[1].blobs[1].data.copy()
# Compare
print "after iter", niter, ": weight diff: ", np.linalg.norm(w_solver_step - w_fwdbwd_update), "and bias diff:", np.linalg.norm(b_solver_step - b_fwdbwd_update)
关于python - caffe python 手册 sgd,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36459266/
// Assuming that data are on the CPU initially, and we have a blob. const Dtype* foo; Dtype* bar;
我计划使用 NYU depth v2 数据集实现一个 CNN,它可以从单个图像估计深度。通过本教程,我了解到在 Caffe 上实现处理分类问题的 CNN 很容易。我很好奇 Caffe 是否适合涉及多维
我用图像训练了一个模型。现在想将 fc-6 功能提取到 .npy 文件中。我正在使用 caffe.set_mode_gpu() 运行 caffe.Classifier 并提取特征。 而不是每帧提取和保
我通过 apt install 命令在我的 Ubuntu v18 VM 上安装了 caffe-cpu。我正在努力找出安装目录所在的位置,如果我错了请纠正我,但我相信没有安装目录。我尝试执行的 NN 模
这个问题在这里已经有了答案: how to calculate a net's FLOPs in CNN [closed] (4 个回答) 4年前关闭。 我在tensorflow tutorial看到
似乎this related PR现在已经死了,有没有解决方法可以使用 early stopping在咖啡厅?也许在 Caffe 之上使用 Python? 最佳答案 第一部分很容易手动完成:让我们监控
当我尝试在MacbookPro(El Capitan)上安装最新的caffe时,出现以下错误。怎么了?如何解决? 我在此网站上发现了一些类似的问题,不幸的是显示的修复似乎是ubuntu特有的。 先感谢
average_loss有什么用?有人可以举一个例子或用外行的术语解释吗? 最佳答案 您可以登录 caffe.proto文件。当前版本中的第 151 行对 average_loss 给出了以下注释:
我想先分别处理不同类型的数据,然后将它们融合到一个公共(public)层中。这在 Caffe 中是否可行,如果可以,最好的方法是什么? 我读过可以在同一个 prototxt 文件中定义多个数据层。但是
我正在尝试将几个底部 Blob 合并为一个顶部 Blob ,然后将其馈送到下一层。 这些 Blob 来自不同的卷积/FC层,因此它们的形状不同。 我尝试了 concat 层,但使用轴 0 或 1 时,
包 Digits 需要使用 Caffe 安装目录的位置设置环境变量。 安装Caffe的简单方法是apt-get install caffe-cuda .但是,我无法弄清楚它的安装位置。没有安装在hom
我在 Caffe 中训练过 imagenet。现在我正在尝试为我的模型和 caffe 提供的训练模型计算 ROC/AUC。我有两个问题: 1) ROC/AUC 主要用于二进制类,但我也发现在某些情况下
我正在尝试使我的 Caffe 代码适应 tensorflow。我想知道将我的 train.txt 和 test.txt 转换为适用于 tensorflow 的最佳方法是什么。 在我的 train.tx
有没有办法安装/运行修改后的 Caffe 项目,例如 SegNet或FCN-Berkley-Vision在 Windows 上? 有Microsoft-led project to bring Caf
我想用python设置一个caffe CNN,使用caffe.NetSpec()界面。虽然我看到我们可以把测试网放在 solver.prototxt , 我想写在model.prototxt具有不同的
我有一个预训练的 faster-rcnn caffemodel。我可以使用 net.params[pr][0].data 获取模型的权重。到目前为止,权重是 numpy float32 类型。我想将它
我正在做一个将 keras json 模型转换为 caffe prototxt 的项目 caffe 支持任意填充值 keras(在 tensorflow 之上)支持“相同”和“有效”值 对于 caff
我正在尝试让 CaffeOnSpark 在本地运行,并且我按照 CaffeOnSpark wiki 上的此过程进行操作:https://github.com/yahoo/CaffeOnSpark/wi
我通过caffe使用我自己的数据集训练了网络,现在我想用C++写一个分类代码。我的机器 (linux) 仅适用于 CPU! (我使用 GPU 在 VM 中训练网络)。 当我尝试“包含”特定的 Caff
我知道可以(以编程方式)使用 caffe.Netspec() 设计一个网络,基本上主要目的是编写它的 prototxt。 net = caffe.NetSpec() .. (define) .. wi
我是一名优秀的程序员,十分优秀!