В v4 своего API, torch представил reshape()
, чтобы больше соответствовать стилю numpy.Ранее, изменение формы тензора факела было сделано с помощью view()
.
. Я подумал, не устареет ли сейчас view()
, и посмотрел на документы .Оказывается, что reshape()
- это не просто псевдоним для view()
, на самом деле у него другая семантика.Факел пытается дать вам непрерывную память, где это возможно.Если новые размеры представления нарушают ограничение смежности, вы должны явно вызвать contiguous()
перед view()
.Reshape
будет работать, даже если это ограничение будет нарушено, но будет молча делать копию данных.Это то же самое поведение, что и в numpy, где reshape
может выдавать копии тоже .
Вопрос по view()
против reshape()
в факеле здесь: ЧтоРазница между изменением формы и представлением в pytorch?
, если вам нужна копия, используйте clone (), если вам нужна та же память, используйте view ().Семантика reshape () состоит в том, что он может или не может совместно использовать хранилище, и вы не знаете заранее.
До сих пор факел предлагался только view()
.Может быть, намеренно заставить своих разработчиков заботиться о разметке памяти.Это заставляет меня задуматься о том, как reshape()
работает в тензорном потоке.
В torch различие между видом и копией может привести к сложным ошибкам.Вы предполагаете, что тензоры обмениваются данными, но они этого не делают.В тензорном потоке эта проблема не должна существовать.Тензор тензорного потока является символическим и не имеет значения.Изменение формы - это просто операция в графе тензорного потока.Хотя график оценивается, данные в заполнителях и переменных не меняются, поэтому ясно, над какими данными вы работаете.
Но я не знаю, может ли это повлиять на производительность.Копирование огромного тензора может быть очень дорогим.Нужно ли быть осторожным при использовании reshape()
, чтобы не дублировать память?