본문 바로가기
인공지능

tf.matmul과 tf.multiply 차이 (행렬곱, 성분곱)

by judy@ 2023. 7. 18.

tf.matmul는 행렬곱 연산을 수행하며 tf.multiply는 element-wise 곱(성분곱) 연산을 수행함. 예시를 들어 연산을 수행해보자.

 

다음과 같은 상황을 가정해보자

# 예시 상황
a = [[1,2,3], [4,5,6]]
b = [[1,2],[3,4],[5,6]]

행렬곱 연산은 정상 동작하나,

# tf.matmul 연산
tf.matmul(a, b)
<tf.Tensor: shape=(2, 2), dtype=int32, numpy=
array([[22, 28],
       [49, 64]], dtype=int32)>

 

성분곱 연산은 오류가 발생한다.

# element-wise 연산
tf.multiply(a, b)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "환경정보/tensorflow/python/util/traceback_utils.py", line 153, in error_handler
    raise e.with_traceback(filtered_tb) from None
  File "환경정보/tensorflow/python/eager/execute.py", line 52, in quick_execute
    tensors = pywrap_tfe.TFE_Py_Execute(ctx._handle, device_name, op_name,
tensorflow.python.framework.errors_impl.InvalidArgumentError: {{function_node __wrapped__Mul_device_/job:localhost/replica:0/task:0/device:CPU:0}} Incompatible shapes: [2,3] vs. [3,2] [Op:Mul]

 

반대로 아래와 같은 상황에서는?

a = [[1, 2, 3], [4, 5, 6]]
c = [[11, 12, 13], [14, 15, 16]]

 

행렬 곱 연산에서 오류가 발생하고

tf.matmul(a, c)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "환경정보/tensorflow/python/util/traceback_utils.py", line 153, in error_handler
    raise e.with_traceback(filtered_tb) from None
  File "환경정보/tensorflow/python/framework/ops.py", line 7215, in raise_from_not_ok_status
    raise core._status_to_exception(e) from None  # pylint: disable=protected-access
tensorflow.python.framework.errors_impl.InvalidArgumentError: {{function_node __wrapped__MatMul_device_/job:localhost/replica:0/task:0/device:CPU:0}} Matrix size-incompatible: In[0]: [2,3], In[1]: [2,3] [Op:MatMul]

성분곱 연산에서는 정상 동작한다

tf.multiply(a, c)
<tf.Tensor: shape=(2, 3), dtype=int32, numpy=
array([[11, 24, 39],
       [56, 75, 96]], dtype=int32)>

 

>>> 결론

 

tf.matmul은 행렬곱, tf.multiply는 성분곱 연산에 사용할 수 있으며, 입력 데이터에 대하여 행렬곱연산의 경우 (m,n), (n,x)의 쉐입을, 성분곱연산의 경우 (m,n), (m,n)의 쉐입을 맞춰 주어야 메서드가 정상적으로 동작한다.

 

반응형