파이썬(Python)

텐서플로우(Tensorflow) Matmul 과 multiply 차이, Broadcasting. reduce_mean. reduce_sum, argmax, reshape, one-hot

알통몬_ 2018. 6. 19. 11:16
반응형


공감 및 댓글은 포스팅 하는데

 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 

도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 

만들어 나가겠습니다^^

 


이번 포스팅에서는 제목처럼

matmul 과 multiply 의 차이, Broadcasting, reduce_mean, reduce_sum, argmax, one-hot에

대해서 공부합니다.


matmul 과 multiply

Matmul 예제 및 결과

import tensorflow as tf

sess = tf.InteractiveSession()

matrix1 = tf.constant([[1., 2.], [3., 4.]])
matrix2 = tf.constant([[10.], [20.]])

print("matrix1 shape :", matrix1.shape)
print("matrix2 shape :", matrix2.shape)

print(tf.matmul(matrix1, matrix2).eval())
sess.close()

결과를 보면 행렬의 곱이랑 같이

[1, 2] [10]                [1*10 + 2+20]    = [50.]

                      =      

[3, 4] [20]                [3*10 + 4*20]     =[110.]

이 나왔습니다.


multiply 예제 및 결과

import tensorflow as tf

sess = tf.InteractiveSession()

matrix1 = tf.constant([[1., 2.], [3., 4.]])
matrix2 = tf.constant([[10.], [20.]])

print((matrix1*matrix2).eval())

sess.close()

multiply의 결과를 보면

[1,2] 에는 10이 곱해지고, [3,4] 에는 20이 곱해졌습니다.

두 결과를 비교해보시면 나에게 필요한 게 matmul인지 multiply인지를 구분하여 사용하시면

되겠습니다.


Broadcasting

multiply 예제에서 곱하기가 일어난 이유는 Broadcasting 때문입니다.

두 matrix의 shape이 같다면 당연히 정상적으로 연산이 되지만

matrix의 shape이나 rank가 다르다면 정상적으로 연산이 일어나면 안되는데,

broadcasting에 동작해서 shape을 맞춰주고 연산이 정상적으로 일어나도록

해줍니다. 그리고 형태가 다른 matrix 끼리도 연산이 되도록 해줍니다.

예제 및 결과

import tensorflow as tf

sess = tf.InteractiveSession()

# shape 이 같은 두 matrix
matrix1 = tf.constant([[1., 2.]])
matrix2 = tf.constant([[3., 4.]])

print("matrix1 + matrix2 : ", (matrix1 + matrix2).eval())

# shape 이 다른 두 matrix
matrix3 = tf.constant([[1., 2.]])
matrix4 = tf.constant(3.)

print("matrix3 + matrix4 : ", (matrix3 + matrix4).eval())

# rank 가 다른 두 matrix
matrix5 = tf.constant([[1., 2.]])
matrix6 = tf.constant([10., 20.])

print("matrix5 + matrix6 : ", (matrix5 + matrix6).eval())

# 형태가 아예 다른 두 matrix
matrix7 = tf.constant([[1., 2.], [3., 4.]])
matrix8 = tf.constant([[10.], [20.]])

print("matrix7 + matrix8 : ", (matrix7 + matrix8).eval())

sess.close()



reduce_mean : 평균을 구하는데 줄여서 구한다.

예제 및 결과

import tensorflow as tf

sess = tf.InteractiveSession()

# 2, 3 의 평균을 구하지만, Int 형이므로 2가 출력
print("tf.reduce_mean([2, 3]).eval() :", tf.reduce_mean([2, 3]).eval())

a = [[1., 2.],
[10., 20.]]
print("tf.reduce_mean(a).eval() :", tf.reduce_mean(a).eval())
print("tf.reduce_mean(a, axis=0).eval() :", tf.reduce_mean(a, 0).eval())
print("tf.reduce_mean(a, axis=1).eval() :", tf.reduce_mean(a, 1).eval())

sess.close()

--------------------------------------------------------------------------------------------------------

--------------------------------------------------------------------------------------------------------








reduce_sum : reduce_mean이 평균을 구하는 거였다면  sum은 합을 구합니다.

예제 및 결과

import tensorflow as tf

sess = tf.InteractiveSession()


print("tf.reduce_sum([2, 3]).eval() :", tf.reduce_sum([2, 3]).eval())

a = [[1., 2.],
[10., 20.]]
print("tf.reduce_sum(a).eval() :", tf.reduce_sum(a).eval())
print("tf.reduce_sum(a, axis=0).eval() :", tf.reduce_sum(a, 0).eval())
print("tf.reduce_sum(a, axis=1).eval() :", tf.reduce_sum(a, 1).eval())

sess.close()


argmax : matrix에서 최대값을 가지는 위치를 반환

import tensorflow as tf

sess = tf.InteractiveSession()

a = [[1., 2., 10.],
[10., 20., 2.]]
print("tf.argmax(a).eval() :", tf.argmax(a).eval())
print("tf.argmax(a, axis=0).eval() :", tf.argmax(a, 0).eval())
print("tf.argmax(a, axis=1).eval() :", tf.argmax(a, 1).eval())

sess.close()

예제를 보시고 실습해보시면 이해가 가실 거에요.


reshape :  matrix의 shape을 변형시킴

import tensorflow as tf
import numpy as np

sess = tf.InteractiveSession()

a = np.array([[[1., 2., 10.],
[10., 20., 2.]],

[[1., 2., 10.],
[10., 20., 2.]]])
print(a.shape)
a2 = tf.reshape(a, [-1, 3]).eval()
print(a2)

a3 = tf.reshape(a, [-1, 1, 3]).eval()
print(a3)

sess.close()



one-hot : matrix에서 하나의 자리만 1로 표현하고 나머지를 0으로 표현해줌

import tensorflow as tf

sess = tf.InteractiveSession()

print(tf.one_hot([[0], [1], [2], [3]], 4).eval())

sess.close()

값의 갯수와 depth를 맞춰주어야 합니다.

matrix , 뒤의 4가 depth인데요.

예를 들어 matrix에서 값을 0, 1, 2, 3 으로 총 4개인데 depth를 3으로 하게되면

마지막 3은 표현이 제대로 나오지 않아요.

import tensorflow as tf

sess = tf.InteractiveSession()

print(tf.one_hot([[0], [1], [2], [3]], 3).eval())

sess.close()

예제를 보면 이해가 되시죠?


더 많은 것들이 있지만 포스팅이 길어지므로 여기까지 하겠습니다.

이상입니다.

감사합니다.

반응형