【发布时间】:2016-05-29 22:37:18
【问题描述】:
我仍在努力在我的连体神经网络上实现小批量梯度更新。以前我有一个实现问题,那就是correctly solved here。
现在我意识到我的神经网络架构也有一个错误,这与我对正确实现的理解不完全有关。
到目前为止,我一直使用非小批量梯度下降方法,其中我将训练元素一个一个传递给梯度更新。现在,我想通过小批量实现梯度更新,从由 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 个元素的梯度更新函数,这个架构就可以很好地工作;应该如何修改它以让它管理 minibatch?
编辑:我可能应该使用nn.Sequencer() class,通过修改我的代码的最后两行:
perceptron:add(nn.Sequencer(parallel_table))
perceptron:add(nn.Sequencer(nn.CosineDistance())).
你们觉得呢?
【问题讨论】:
标签: lua neural-network torch