Я все еще работаю над реализацией мини-пакетного обновления градиента в моей сиамской нейронной сети. Раньше у меня была проблема с реализацией, которая была n">правильно решено здесь.
Теперь я понял, что в архитектуре моей нейросети тоже была ошибка, связанная с моим неполным пониманием правильной реализации.
До сих пор я всегда использовал подход градиентного спуска без мини-пакетов, в котором я передавал обучающие элементы один за другим в обновление градиента. Теперь я хочу реализовать обновление градиента с помощью мини-пакета, начиная, скажем, с мини-пакетов, состоящих из элементов 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 элемент; как изменить его, чтобы он мог управлять мини-пакетом?
EDIT: мне, вероятно, следует использовать nn. Sequencer(), изменив последние две строки моего кода:
perceptron:add(nn.Sequencer(parallel_table))
perceptron:add(nn.Sequencer(nn.CosineDistance())).
Ребята, что вы думаете?