Добавление к существующему здесь ответу. Причина, по которой detach
не копирует данные, определенно состоит в том, чтобы сохранить ненужные копии - если вы хотите получить полную копию, вы всегда можете иметь a.clone().detach()
версию a
(или a.detach().clone()
). Вы можете сделать только один из них (например, просто clone
или просто detach
), и все они имеют смысл в некоторых ситуациях.
Самая важная причина, по которой можно было бы использовать detach
без clone
потому что это способ реализовать так называемую операцию «StopGradient» в pytorch (stop_gradient в tf). Представьте себе ситуацию, когда вы хотите использовать тензор a
в своей NN дважды таким образом, чтобы градиенты распространялись в одном случае и не распространялись в другом (и никто не ожидал, что никто не изменит тензор на месте).
Что касается clone
без detach
- это кажется немного необычным, но я видел такие примеры (в основном люди хотели убедиться, что исходный тензор не будет обновляться, но градиенты будут распространяться к нему).
Обычно вам следует избегать изменения тензоров на месте (кроме шагов оптимизатора). В любом случае вам придется проявлять крайнюю осторожность при этом, поскольку это простой способ сделать граф вычислений недействительным по отношению к вычислению градиента.