TensorFlow использует механизм вещания NumPy для обработки арифметических операций между тензорами разных форм для экономии памяти и повышения эффективности вычислений.
Операции с массивами NumPy обычно представляют собой поэлементные вычисления, поэтому требуетсяформа должна быть одинаковой:
>>> a = np.array([1.0, 2.0, 3.0])
>>> b = np.array([2.0, 2.0, 2.0])
>>> a * b
array([ 2., 4., 6.])
Механизм вещания NumPy снимает это ограничение, и в двух массивахформаудовлетворитькакое-то условиеАрифметические операции по-прежнему можно выполнять между массивами разных форм. Самый простой — умножить массив на скаляр:
>>> a = np.array([1.0, 2.0, 3.0])
>>> b = 2.0
>>> a * b
array([ 2., 4., 6.])
результат и первыйb
такой же, как пример массива. можно рассматривать как скалярb
растянулся в иa
Для массива той же формы значение каждого элемента растянутого массива является копией предыдущего скалярного значения, поэтому форма такая же, как в первом примере, поэтому результат, конечно же, тот же. но это простотеорияВыше операция копирования на самом деле не выполняется, она просто использует скалярное значение в расчете. следовательно,Второй пример более эффективен, потому что экономится память.
Правила трансляции
При выполнении арифметических операций над двумя массивамиNumPy сравнивает форму двух массивов поэлементно, сзади наперед. Условие широковещания считается выполненным, когда значения элементов, сравниваемые по одному, удовлетворяют следующим условиям:
- равный
- один из них 1
Когда он не удовлетворен, он броситValueError: frames are not aligne
аномальный. Каждый элемент формы результата арифметической операции является максимальным значением при поэлементном сравнении двух фигур массива.
Кроме того, два массива могут иметь разные размеры. например256x256x3
представляет собой массив значений RGB, которые, если масштабировать их по-разному для каждого цветового канала, мы можем умножить на одномерную форму(3, )
массив . потому чтозадом напередсравни, поэтому3 == 3
, что соответствует Правилам вещания.
Image (3d array): 256 x 256 x 3
Scale (1d array): 3
Result (3d array): 256 x 256 x 3
когда один из1
, он «растягивается» до того же размера, что и другой, т.е. «скопирует» (без фактического копирования) значение элемента, чтобы оно соответствовало другому, например:
A (4d array): 8 x 1 x 6 x 1
B (3d array): 7 x 1 x 5
Result (4d array): 8 x 7 x 6 x 5
Еще примеры:
A (2d array): 5 x 4
B (1d array): 1
Result (2d array): 5 x 4
A (2d array): 5 x 4
B (1d array): 4
Result (2d array): 5 x 4
A (3d array): 15 x 3 x 5
B (3d array): 15 x 1 x 5
Result (3d array): 15 x 3 x 5
A (3d array): 15 x 3 x 5
B (2d array): 3 x 5
Result (3d array): 15 x 3 x 5
A (3d array): 15 x 3 x 5
B (2d array): 3 x 1
Result (3d array): 15 x 3 x 5
Некоторые контрпримеры (не удовлетворяющие правилам вещания):
A (1d array): 3
B (1d array): 4 # trailing dimensions do not match
A (2d array): 2 x 1
B (3d array): 8 x 4 x 3 # second from last dimensions mismatched
упражняться:
>>> x = np.arange(4)
>>> xx = x.reshape(4,1)
>>> y = np.ones(5)
>>> z = np.ones((3,4))
>>> x.shape
(4,)
>>> y.shape
(5,)
>>> x + y
<type 'exceptions.ValueError'>: shape mismatch: objects cannot be broadcast to a single shape
>>> xx.shape
(4, 1)
>>> y.shape
(5,)
>>> (xx + y).shape
(4, 5)
>>> xx + y
array([[ 1., 1., 1., 1., 1.],
[ 2., 2., 2., 2., 2.],
[ 3., 3., 3., 3., 3.],
[ 4., 4., 4., 4., 4.]])
>>> x.shape
(4,)
>>> z.shape
(3, 4)
>>> (x + z).shape
(3, 4)
>>> x + z
array([[ 1., 2., 3., 4.],
[ 1., 2., 3., 4.],
[ 1., 2., 3., 4.]])
Другой пример:
>>> a = np.array([0.0, 10.0, 20.0, 30.0])
>>> b = np.array([1.0, 2.0, 3.0])
>>> a[:, np.newaxis] + b
array([[ 1., 2., 3.],
[ 11., 12., 13.],
[ 21., 22., 23.],
[ 31., 32., 33.]])
newaxis
работать как массивa
Вставьте одномерное, станьте двухмерным4x1
Массив, так4x1
массив плюс(3, )
массив, результат4x3
массив .
Ссылаться на
-- END
Хорошо написано, это помогло вам, пожалуйста, спонсируйте плату за хостинг ~