Caffe LeNet:`solver.step(1)` 和 `solver.net.forward()` 之间的区别

Caffe LeNet: Difference between `solver.step(1)` and `solver.net.forward()`

我正在查看 Caffe LeNet 教程 here,我想到了一个问题:

这两个代码有什么区别:

self.solver.step(1)

self.solver.net.forward()  # train net

他们似乎都至少根据评论训练了网络。

我个人认为第一个在训练数据上训练网络并更新 nettest_net 的权重,但第二个似乎只转发一批数据并应用从上一步学习权重。

如果我认为是对的,那么教程中第二个代码的目的是什么?为什么代码做了 net.forward ?不能 solver.step(1) 自己做吗?

感谢您的宝贵时间

step 进行一次完整的迭代,涵盖所有三个阶段:forward evaluation,backward传播,以及 更新。对 forward 的调用只执行其中的第一个。签名(参数列表)也有差异

我在 solver.step(1)solver.net.forward() 中发现了一个奇怪的行为。当我为输入网络使用自定义层时,我的实例层在使用之前需要一个变量:

solver.net.layers[0].mySet(variable)

variable 是在我的图层的局部变量中设置的。但是当我调用 solver.step 时,那个变量没有出现。但是,当我使用 solver.net.forward() 时,它确实如此。我不确定,但也许 solver.step 正在为层实例化一个新变量。