Механизм трансляции TensorFlow и NumPy

искусственный интеллект TensorFlow NumPy Element

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. равный
  2. один из них 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массив .

Ссылаться на

  1. docs.last friend.org/doc/num py/U…

-- END

Хорошо написано, это помогло вам, пожалуйста, спонсируйте плату за хостинг ~