Итак, у меня есть глубокая сверточная сеть со слоем lstm, и после слоя ltsm она разделяется, чтобы вычислить две разные функции (используя два разных линейных слоя), результаты которых затем складываются вместе, чтобы сформировать окончательный вывод сети.
Когда я вычисляю потерю сети, чтобы можно было рассчитать градиенты и обновить веса, я выполняю несколько операций, а затем вычисляю потери между производным значением и вычисленным целевым значением.
def update(output, target):
# target output is calculated outside the function
# operations on output
loss(output, target).backward()
self.optimizer.step()
Сеть имеет некоторые потери (иногда в очень небольшом порядке, но иногда и в более высоких порядках), например, некоторые потери:
tensor(1.00000e-04 *
5.7420)
tensor(2.7190)
tensor(0.9684)
Он также имеет градиенты, рассчитанные здесь:
for param in self.parameters():
print(param.grad.data.sum())
Какие выходы:
tensor(1.00000e-03 *
1.9996)
tensor(1.00000e-03 *
2.6101)
tensor(1.00000e-02 *
-1.3879)
tensor(1.00000e-03 *
-4.5834)
tensor(1.00000e-02 *
2.1762)
tensor(1.00000e-03 *
3.6246)
tensor(1.00000e-03 *
6.6234)
tensor(1.00000e-02 *
2.9373)
tensor(1.00000e-02 *
1.2680)
tensor(1.00000e-03 *
1.8791)
tensor(1.00000e-02 *
1.7322)
tensor(1.00000e-02 *
1.7322)
tensor(0.)
tensor(0.)
tensor(1.00000e-03 *
-6.7885)
tensor(1.00000e-02 *
9.7793)
И
tensor(2.4620)
tensor(0.9544)
tensor(-26.2465)
tensor(0.2280)
tensor(-219.2602)
tensor(-2.7870)
tensor(-50.8203)
tensor(3.2548)
tensor(19.6163)
tensor(-18.6029)
tensor(3.8564)
tensor(3.8564)
tensor(0.)
tensor(0.)
tensor(0.8040)
tensor(-0.1157)
Но когда я сравниваю вес до и после запуска оптимизатора, я получаю результат, что веса равны друг другу.
Код для проверки изменения веса:
before = list(neuralnet.parameters())
neuralnet.update()
after = list(neuralnet.parameters())
for i in range(len(before)):
print(torch.equal(before[i].data, after[i].data))
Приведенное выше возвращает True для каждой итерации.