Как повысить численную точность модели Pytorch? - PullRequest
0 голосов
/ 29 сентября 2019

Со следующей строкой:

print(self.netG(self.real_A)-self.netG(self.real_A))

Я думаю, что могу получить нулевой тензор, но нет.

tensor([[ [[-0.0032,  0.0089, -0.0085,  ..., -0.0027,  0.0004, -0.0022],
          [-0.0019, -0.0022,  0.0775,  ...,  0.0236, -0.0277, -0.0125],
          [ 0.0049,  0.0159,  0.0203,  ..., -0.0212,  0.0010, -0.0069],
          ...,
          [ 0.0042,  0.0081, -0.0127,  ..., -0.0097,  0.0136, -0.0002],
          [-0.0010,  0.0020, -0.0066,  ...,  0.0260,  0.0433,  0.0088],
          [-0.0023,  0.0095,  0.0125,  ...,  0.0005,  0.0090,  0.0029]]]],
       device='cuda:0', grad_fn=<SubBackward0>)

1 Ответ

0 голосов
/ 30 сентября 2019

При работе со значениями с плавающей запятой ассоциативность некоторых вещественных операций не сохраняется.Это означает, например, что нет гарантии, что (a + b) + c == a + (b + c).

В большинстве кодов, с которыми вы работаете ежедневно, порядок операций фиксирован, так что вы только когда-либо сможете наблюдать (a + b) + c или a + (b + c) (в зависимости от того, что написал программист), но в PyTorch, на бэкэнде CUDA, есть ряд таких операций, которые не детерминированы (из-за параллелизма).Это означает, что при одном запуске вашего self.netG(self.real_A) вы можете наблюдать (a + b) + c, а при другом a + (b + c).Не видя ваш код, никто не может сказать, но это, вероятно, источник вашего удивления.Немного больше дано в PyTorch docs .

РЕДАКТИРОВАТЬ: очевидно, вы также можете переключать свои вычисления на 64-битные числа с плавающей запятой, что повысит числовую точность (как это обычно бывает)определено) ваших расчетов, но вряд ли поможет с недетерминизмом (на что вы действительно жалуетесь).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...