Я немного поэкспериментировал с факелом, и вот что я нашел:
( 5,7,3) and ( 5,7,3) -> ( 5,7,3)
- равно
(5,3,4,1) and (5,3,1,1) -> (5,3,4,1)
- один тусклый - 1
(5,3,4,1) and ( 3,4,1) -> (5,3,4,1)
- одна тусклость не существует
(5,3,4,1) and ( 3,1,1) -> (5,3,4,1)
- одна яркость равна 1, а другая не существует
( 4,3,2) and (5,4,1,1) -> (5,4,3,2)
( 4,1) and (5,3,1,1) -> (5,3,4,1)
- одна яркость равна 1, а две не существуют
( 1) and (5,3,4,2) -> (5,3,4,2)
- один дим 1 и другие не существуют
( ) and (5,3,4,2) -> (5,3,4,2)
- скаляр и тензор
( 0) and (5,3,2,1) -> (5,3,2,0)
- пустой тензор и тензор
( 4,1) and ( 4) -> ( 4,4)
- отсутствует значение dim 1
( 4,2) and ( 4)
-> не транслируется
( 5,2,1) and (5,3,2,1)
-> не транслируется
(5,3,2,1) and ( 5,3,2)
-> не транслируется
Документация Pytorch гласит:
Многие операции PyTorch поддерживают семантику NumPy Broadcasting.
Значит ли это, что pytorch следует правилам вещания numpy, и они одинаковы, или я тоже должен поэкспериментировать с numpy?
В документации для numpy нет конкретных правил, как в правилах pytourch'а. И даже документация pytorch'а не совсем точна, например, он говорит, что каждый тензор должен иметь хотя бы одно измерение , но torch.empty(3,4) + torch.tensor(42)
работает нормально (у скаляра нет измерений).
Правила, которые я нашел:
- Начиная с конечного размера, размеры тусклых частей должны быть либо равны, либо один из них должен быть равен 1 (для пропущенных первых тусклых единиц предполагается 1).
- Для каждого тусклого результирующего тусклого числа есть максимум двух.
- Операции на месте не позволяют тензору на месте изменять форму.
Кажется, что это самый разумный подход к вещанию, и я не понимаю, почему он был бы другим для numpy. Но, возможно, есть некоторые особенности.
Если кто-то может предоставить доказательства или, по крайней мере, ручаться за то, что у numpy те же правила, что и у pytorch, то я был бы благодарен, так как не пришлось бы изучать поведение numpy вещания.