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

6
我正在查看Caffe LeNet教程 (此处链接为外部网站),然后我想到了一个问题: 这两段代码有什么区别:
self.solver.step(1)

并且

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

他们似乎都至少根据注释训练网络。
个人认为第一个代码在训练数据上训练网络并更新nettest_net的权重,但第二个代码似乎只是转发一批数据并应用之前步骤中学到的权重。
如果我想的对的话,那么教程中第二段代码的目的是什么?为什么代码要执行net.forwardsolver.step(1)不能自己做吗?
感谢您的时间。
2个回答

9

step表示一次完整的迭代,包括三个阶段:前向计算、反向传播和更新。调用forward仅执行第一个阶段。此外,函数签名(参数列表)也有所不同。


谢谢...如果batch_size为100(在2000张图像中),那么step()函数会在100批次还是2000批次上执行3个阶段? - Cypher
4
Step 只完成一个迭代:一个大小为 100 的图像批次。完成一整套 20 批次(所有 2000 个输入)被称作一个“epoch”。 - Prune
很高兴能够帮助。感谢您的点赞和采纳。 - Prune
@Prune:solver.solve()是做什么的?假设我有200个迭代、2000张图片和100个批次。我应该这样做: for 1 until iter solver.step(1) test, etc 还是应该这样做: for 1 until iter solver.step(20) test, etc ?或者我只需要使用solver.solve()? - Hossein
请查看此处的部分答案#1 here。区别在于您是否想要在20次迭代后进行干预。 - Prune

0

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

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

那个变量是在我的层的本地变量中设置的。但是当我调用solver.step时,该变量不会出现。 然而,在使用solver.net.forward()时,它确实出现了。 我不确定,但也许solver.step正在为该层实例化一个新变量。


这是一个回答吗?还是一个新的问题? - Shai
事实上,它是两者兼备的。我正在使用一个层来进行操作: self.solver.net.layers[0].set_data(data),在该层中定义了以下内容:def set_data(self, data): self._data = data但是,当我调用 solver.step(1) 时,程序返回以下信息:AttributeError: 'DataLayer' object has no attribute '_data' - Tushin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接