我仍在努力在我的连体神经网络上实现小批量梯度更新。以前我有一个执行问题,那就是correctly solved here。火炬/ Lua,小批量训练的神经网络结构?
现在我意识到我的神经网络架构中也存在一个错误,这与我对正确实现的不完全理解有关。
到目前为止,我一直使用非小批次梯度下降方法,其中我将训练元素逐个传递给梯度更新。现在,我想通过小批量实现梯度更新,比如用N = 2个元素构成的小型贴片开始。
我的问题是:我应该如何改变我的连体神经网络的架构,使其能够处理N = 2个元素的小批量而不是单个元素?
这是我的连体神经网络的(简化的)体系结构:
nn.Sequential {
[input -> (1) -> (2) -> output]
(1): nn.ParallelTable {
input
|`-> (1): nn.Sequential {
| [input -> (1) -> (2) -> output]
| (1): nn.Linear(6 -> 3)
| (2): nn.Linear(3 -> 2)
| }
|`-> (2): nn.Sequential {
| [input -> (1) -> (2) -> output]
| (1): nn.Linear(6 -> 3)
| (2): nn.Linear(3 -> 2)
| }
... -> output
}
(2): nn.CosineDistance
}
我有:
- 2相同连体神经网络(上部和下部)
- 6输入单元
- 3个隐藏单位
- 2个输出单位 两个平行神经网络
这里的输出与
perceptronUpper= nn.Sequential()
perceptronUpper:add(nn.Linear(input_number, hiddenUnits))
perceptronUpper:add(nn.Linear(hiddenUnits,output_number))
perceptronLower= perceptronUpper:clone('weight', 'gradWeights', 'gradBias',
'bias')
parallel_table = nn.ParallelTable()
parallel_table:add(perceptronUpper)
parallel_table:add(perceptronLower)
perceptron = nn.Sequential()
perceptron:add(parallel_table)
perceptron:add(nn.CosineDistance())
这种架构工作得非常好,如果我有一个梯度更新函数,采用1个元素;如何修改它以让它管理一个小批次?
编辑:
perceptron:add(nn.Sequencer(parallel_table))
perceptron:add(nn.Sequencer(nn.CosineDistance())).
你们有什么想:我也许应该通过修改我的代码的最后两行使用nn.Sequencer() class,?
嗨@Alexander,谢谢你的回复。我试图实现你的解决方案,但我陷入了梯度更新'perceptron:backward(input_batch,targets)'指令。 '目标'应该包含我训练的目标,例如'0,1'。如果'input_batch'是大小为3x5的2个DoubleTensors列表,那么'target'的正确尺寸应该是多少?谢谢 –
@ DavideChicco.it,目标是最小化输入对之间的距离,对吗?那么你的目标是什么?我会认为它是零。 '0,1'从哪里来? –
我正在比较向量对。每个矢量由6个实数值组成。每对可以是true(target = 1)或false(target = 0)。在训练过程中,我称之为'感知器:前向(input_batch)',然后'感知器:zeroGradParameters()'和'感知器:反向(input_batch,目标)'。我在“目标”的尺寸方面遇到麻烦,我不得不适应新的设置。大小为1的#input_batch DoubleTensors矢量不起作用,应该使用什么?谢谢 –