- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
查看this PR ,我看到可以为 caffe.Solver
对象定义 on_start
和 on_gradient
回调。
import caffe
solver = caffe.AdamSolver('solver.prototxt')
solver.add_callback(on_start, on_gradient) # <- ??
on_start
和on_gradient
是什么类型的对象?
这些回调有什么用?
如何使用它们(一个例子会很好...)?
最佳答案
<强>1。在哪里以及如何定义回调?
回调是求解器的一部分,因此在 solver.hpp
中定义文件。确切地说,有一个 Callback
类,看起来像这样:
// Invoked at specific points during an iteration
class Callback {
protected:
virtual void on_start() = 0;
virtual void on_gradients_ready() = 0;
template <typename T>
friend class Solver;
};
const vector<Callback*>& callbacks() const { return callbacks_; }
void add_callback(Callback* value) {
callbacks_.push_back(value);
}
和一个protected vector此类回调的集合,它是 Solver
类的成员。
vector<Callback*> callbacks_;
因此,这基本上为 Solver
类提供了一个 add_callback
函数,它允许将类型为 Callback
的对象添加到向量.这是为了确保每个回调都有两个方法:on_start()
和 on_gradients_ready()
。
<强>2。在哪里调用回调?
这发生在 solver.cpp
文件,在 step()
函数,其中包含主工作循环。这是主循环部分(为简单起见,去掉了很多东西):
while (iter_ < stop_iter) {
for (int i = 0; i < callbacks_.size(); ++i) {
callbacks_[i]->on_start();
}
// accumulate the loss and gradient
Dtype loss = 0;
for (int i = 0; i < param_.iter_size(); ++i) {
loss += net_->ForwardBackward();
}
loss /= param_.iter_size();
for (int i = 0; i < callbacks_.size(); ++i) {
callbacks_[i]->on_gradients_ready();
}
ApplyUpdate();
++iter_;
}
<强>3。这个用在什么地方?
此回调功能是在添加多 GPU 支持时实现的。唯一使用回调的地方(据我所知)是在多个 GPU 之间同步求解器:
P2PSync
在 parallel.hpp
中上课继承自 Solver::Callback
类,并实现 on_start()
和 on_gradients_ready()
方法,同步 GPU 并最终累积所有梯度更新。
<强>4。如何使用 Python 的回调?
作为拉取请求 #3020解释,
on_start
andon_gradient
are python functions.
所以它应该是直接使用。 this Github Gist 中显示了完整的可运行示例我创建。
<强>5。这有什么用?
由于这两个回调函数不接受任何参数,您不能简单地使用它们来跟踪丢失或类似的事情。为此,您必须围绕 Solver
类创建一个包装函数,并使用两个方法调用 add_callback
作为回调函数。这允许您使用 self.solver.net
从回调中访问网络。在下面的示例中,我使用 on_start
回调将数据加载到网络中,并使用 on_gradients_ready
回调打印损失函数。
class SolverWithCallback:
def __init__(self, solver_file):
self.solver = caffe.SGDSolver(solver_file)
self.solver.add_callback(self.load, self.loss)
def solve(self):
self.solver.solve()
def load(self):
inp = np.random.randint(0, 255)
self.solver.net.blobs['data'].data[...] = inp
self.solver.net.blobs['labels'].data[...] = 2 * inp
def loss(self):
print "loss: " + str(self.solver.net.blobs['loss'].data)
if __name__=='__main__':
solver = SolverWithCallback('solver.prototxt')
solver.solve()
关于python - pycaffe 中的求解器回调函数是什么,我该如何使用它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41490526/
C语言sscanf()函数:从字符串中读取指定格式的数据 头文件: ?
最近,我有一个关于工作预评估的问题,即使查询了每个功能的工作原理,我也不知道如何解决。这是一个伪代码。 下面是一个名为foo()的函数,该函数将被传递一个值并返回一个值。如果将以下值传递给foo函数,
CStr 函数 返回表达式,该表达式已被转换为 String 子类型的 Variant。 CStr(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CSng 函数 返回表达式,该表达式已被转换为 Single 子类型的 Variant。 CSng(expression) expression 参数是任意有效的表达式。 说明 通常,可
CreateObject 函数 创建并返回对 Automation 对象的引用。 CreateObject(servername.typename [, location]) 参数 serv
Cos 函数 返回某个角的余弦值。 Cos(number) number 参数可以是任何将某个角表示为弧度的有效数值表达式。 说明 Cos 函数取某个角并返回直角三角形两边的比值。此比值是
CLng 函数 返回表达式,此表达式已被转换为 Long 子类型的 Variant。 CLng(expression) expression 参数是任意有效的表达式。 说明 通常,您可以使
CInt 函数 返回表达式,此表达式已被转换为 Integer 子类型的 Variant。 CInt(expression) expression 参数是任意有效的表达式。 说明 通常,可
Chr 函数 返回与指定的 ANSI 字符代码相对应的字符。 Chr(charcode) charcode 参数是可以标识字符的数字。 说明 从 0 到 31 的数字表示标准的不可打印的
CDbl 函数 返回表达式,此表达式已被转换为 Double 子类型的 Variant。 CDbl(expression) expression 参数是任意有效的表达式。 说明 通常,您可
CDate 函数 返回表达式,此表达式已被转换为 Date 子类型的 Variant。 CDate(date) date 参数是任意有效的日期表达式。 说明 IsDate 函数用于判断 d
CCur 函数 返回表达式,此表达式已被转换为 Currency 子类型的 Variant。 CCur(expression) expression 参数是任意有效的表达式。 说明 通常,
CByte 函数 返回表达式,此表达式已被转换为 Byte 子类型的 Variant。 CByte(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CBool 函数 返回表达式,此表达式已转换为 Boolean 子类型的 Variant。 CBool(expression) expression 是任意有效的表达式。 说明 如果 ex
Atn 函数 返回数值的反正切值。 Atn(number) number 参数可以是任意有效的数值表达式。 说明 Atn 函数计算直角三角形两个边的比值 (number) 并返回对应角的弧
Asc 函数 返回与字符串的第一个字母对应的 ANSI 字符代码。 Asc(string) string 参数是任意有效的字符串表达式。如果 string 参数未包含字符,则将发生运行时错误。
Array 函数 返回包含数组的 Variant。 Array(arglist) arglist 参数是赋给包含在 Variant 中的数组元素的值的列表(用逗号分隔)。如果没有指定此参数,则
Abs 函数 返回数字的绝对值。 Abs(number) number 参数可以是任意有效的数值表达式。如果 number 包含 Null,则返回 Null;如果是未初始化变量,则返回 0。
FormatPercent 函数 返回表达式,此表达式已被格式化为尾随有 % 符号的百分比(乘以 100 )。 FormatPercent(expression[,NumDigitsAfterD
FormatNumber 函数 返回表达式,此表达式已被格式化为数值。 FormatNumber( expression [,NumDigitsAfterDecimal [,Inc
我是一名优秀的程序员,十分优秀!