在Caffe上,我正在尝试实现一个用于语义分割的全卷积网络。我想知道在设置以下超参数的'solver.prototxt'
值时是否有特定的策略:
- test_iter
- test_interval
- iter_size
- max_iter
这是否取决于你用于训练集的图像数量?如果是,如何依赖?
回答:
为了有意义地设置这些值,你需要了解一些关于数据的额外信息:
1. 训练集大小 你拥有的训练样本总数,我们称这个数量为T
。
2. 训练批次大小 一次批次中一起处理的训练样本数量,通常由'train_val.prototxt'
中的输入数据层设置。例如,在这个文件中,训练批次大小设置为256。我们用tb
表示这个数量。
3. 验证集大小 你为验证模型而预留的样本总数,我们用V
表示。
4. 验证批次大小 在TEST阶段设置的batch_size
值。在这个例子中,它被设置为50。我们称这个为vb
。
现在,在训练过程中,你希望不时地获得网络性能的无偏估计。为此,你需要在验证集上运行test_iter
次迭代。要覆盖整个验证集,你需要设置test_iter = V/vb
。
你希望多长时间获得一次这样的估计?这完全取决于你。如果你的验证集非常大且网络运行缓慢,太频繁的验证会使训练过程变得过长。另一方面,不够频繁的验证可能会让你无法注意到训练过程是否以及何时未能收敛。test_interval
决定了你验证的频率:通常对于大型网络,你会将test_interval
设置为5K的数量级,对于较小且运行较快的网络,你可以选择较低的值。同样,这完全取决于你。
为了覆盖整个训练集(完成一个“epoch”),你需要运行T/tb
次迭代。通常人们会训练几个epoch,因此max_iter=#epochs*T/tb
。
关于iter_size
:这允许在多个训练小批次上平均梯度,详见这个讨论。