Различные `grad_fn` для похожих операций в Pytorch (1.0)

Я работаю над моделью внимания, и перед запуском окончательной модели я просматривал тензорные формы, которые проходят через код. У меня есть операция, в которой мне нужно изменить форму тензора. Тензор имеет форму torch.Size([[30, 8, 9, 64]]), где 30 — это batch_size, 8 — это число головок внимания (это не имеет отношения к моему вопросу), 9 — это количество слов в предложении, а 64 — это некоторое промежуточное представление встраивания слова. Я должен изменить форму тензора до размера torch.size([30, 9, 512]) перед дальнейшей обработкой. Итак, я искал в Интернете некоторые ссылки, и они сделали следующее x.transpose(1, 2).contiguous().view(30, -1, 512), тогда как я думал, что это должно работать x.transpose(1, 2).reshape(30, -1, 512).

В первом случае grad_fn равно <ViewBackward>, тогда как в моем случае это <UnsafeViewBackward>. Разве это не две одинаковые операции? Не приведет ли это к ошибке обучения?


person abkds    schedule 24.04.2019    source источник
comment
две операции различны, поэтому вы получаете разные grad_fn. Посетите здесь для получения дополнительной информации.   -  person David Ng    schedule 27.04.2019


Ответы (1)


Разве это не две одинаковые операции?

Нет. Хотя они фактически производят один и тот же тензор, операции не одинаковые, и они не обязательно будут иметь одинаковые storage.

TensorShape.cpp:

// _unsafe_view() differs from view() in that the returned tensor isn't treated
// as a view for the purposes of automatic differentiation. (It's not listed in
// VIEW_FUNCTIONS in gen_autograd.py).  It's only safe to use if the `self` tensor
// is temporary. For example, the viewed tensor here (a + b) is discarded immediately
// after viewing:
//
//  res = at::_unsafe_view(a + b, size);
//
// This is a hack because in-place operations on tensors treated like views
// can be much more expensive than the same operations on non-view tensors.

Обратите внимание, что это может привести к ошибке при применении к сложные входные данные, но, как правило, они еще не полностью поддерживаются в PyTorch и не являются уникальными для этой функции.

person iacob    schedule 03.05.2021