구글에서 진행했던 조대협님의 텐소플로우 강의와 김성 교수님의 강의를 듣고 개인적으로 공부하면서 정리한 내용입니다
아래 소스는 김성 교수님 강의의 소스를 그대로 가져왔고, 수업을 들으면서 주석으로 정리한 부분입니다
1차원
import tensorflow as tf
import numpy as np
# 1차원
t = np.array([0., 1., 2., 3., 4., 5., 6.])
print(t.ndim) # 차원 -> 1차원 (dimension)
print(t.shape) # 개수(=크기) -> 7개
print(t[0]) # 배열의 인덱스와 같음
print(t[1]) # 배열의 인덱스와 같음
print(t[-1]) # 마지막 데이터 한개를 의미
print(t[2:5]) # idx[2] ~ idx[5-1]
print(t[4:-1]) # idx[4] ~ idx[마지막-1]
print(t[:2]) # ~ idx[2-1]
print(t[3:]) # idx[3] ~
실습
1
(7,)
0.0
1.0
6.0
[ 2. 3. 4.]
[ 4. 5.]
[ 0. 1.]
[ 3. 4. 5. 6.]
2차원
import tensorflow as tf
import numpy as np
# 2차원
t = np.array([[1., 2., 3.],
[4., 5., 6.],
[7., 8., 9.],
[10., 11., 12.]]
)
print(t.ndim) # 차원 -> 2차원
print(t.shape) # 개수 -> (4, 3) (=행, 열)
결과
2
(4, 3)
다차원
import tensorflow as tf
import numpy as np
t = np.array([
[
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]
],
[
[13, 14, 15, 16],
[17, 18, 19, 20],
[21, 22, 23, 24]
]
]
])
print(t.shape)
결과
(1, 2, 3, 4)
Matmul
행렬간 곱셈을 위해서는 ‘*‘가 아닌 matmul 함수를 이용하여 곱셈을 해야 합니다.
import tensorflow as tf
import numpy as np
matrix1 = tf.constant([[1., 2.], [3., 4.]]) # shape(2, 2)
matrix2 = tf.constant([[1.], [3.]]) # shape(2, 1)
tf.matmul(matrix1, matrix2).eval(session=tf.Session())
결과
array([[ 7.],
[ 15.]], dtype=float32)
Broadcasting
Shape이 다르더라도 연산이 가능하도록 해준다, 가지고 있는 값을 이용하여 Shape을 맞춰춥니다. (잘못 사용하면 예상하지 못한 값을 가져올 수 있기 때문에 사용함에 유의해야 한다)
Axis
axis는 0부터 시작해서 안으로 들어갈때마다 하나씩 증가한다 (axis[-1]은 마지막 axis를 의미)
[[1., 2.]
[3., 4.]]
일때, axis = 0 : 세로 -> (1, 3), (2, 4) axis = 1 : 가로 -> (1, 2), (3, 4) (가장 안쪽) axis = -1 : 가장 안쪽 -> (1, 2), (3, 4) (가장 안쪽)
Reduce Mean
행렬에서 여러 값이 있을때 줄여 주는 역할, axis(=축)에 따라서 평균을 내어줌
import tensorflow as tf
import numpy as np
x = [[1., 2.],
[3., 4.]]
print(tf.reduce_mean(x).eval(session=tf.Session()))
print(tf.reduce_mean(x, axis=0).eval(session=tf.Session())) # axis=0으로 reduce mean
print(tf.reduce_mean(x, axis=1).eval(session=tf.Session())) # axis=1로 reduce mean
결과
2.5
[ 2. 3.]
[ 1.5 3.5]
Reshape(**)
텐소의 Shape를 변경할때 사용, 안에 shape에 원하는 값을 넣으면 해당 shape 맞게 조정된다.
보통은 가장 안쪽은 그대로 가져오고 바깥쪽 reshape 하게 된다.
(** shape에 '-1'을 넣게 되면 변경에 맞춰서 값이 들어가게 된다)
import tensorflow as tf
import numpy as np
# reshape
t = np.array([[[0, 1, 2],
[3, 4, 5]],
[[6, 7, 8],
[9, 10, 11]]])
print(t.shape)
sess = tf.Session()
print(tf.reshape(t, shape=[-1, 3]).eval(session=sess))
print(tf.reshape(t, shape=[-1, 1, 3]).eval(session=sess))
결과
(2, 2, 3)
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
[[[ 0 1 2]]
[[ 3 4 5]]
[[ 6 7 8]]
[[ 9 10 11]]]
One hot Encoding
데이터를 0과 1의 나열로 바꿔주는 것, depth에 따라서 Rank가 생김
import tensorflow as tf
import numpy as np
tf.one_hot([[0], [1], [2], [0]], depth=3).eval(session=tf.Session())
결과
array([[[ 1., 0., 0.]],
[[ 0., 1., 0.]],
[[ 0., 0., 1.]],
[[ 1., 0., 0.]]], dtype=float32)
Casting
dtype으로 바꿔준다, 주로 True, False를 0과 1로 바꿔준다 (=Onehot Encoding)
import tensorflow as tf
import numpy as np
print(tf.cast([1.8, 2.2, 3.3, 4.9], tf.int32).eval(session=tf.Session()))
print(tf.cast([True, False, 1 == 1, 0 == 1], tf.int32).eval(session=tf.Session()))
결과
[1 2 3 4]
[1 0 1 0]
Stack
Stack 구조로 쌓아주는 의미
import tensorflow as tf
import numpy as np
x = [1, 4]
y = [2, 5]
z = [3, 6]
tf.stack([x, y, z]).eval(session=tf.Session())
결과
array([[1, 4],
[2, 5],
[3, 6]], dtype=int32)
Ones and Zeros like
주어진 shape에 0 or 1을 채운 행렬을 만들어줌
import tensorflow as tf
import numpy as np
x = [[0, 1, 2],
[2, 1, 0]]
print(tf.ones_like(x).eval(session=tf.Session())) # 1로 채운
print(tf.zeros_like(x).eval(session=tf.Session())) # 0으로 채운
결과
[[1 1 1]
[1 1 1]]
[[0 0 0]
[0 0 0]]
Zips
복수개의 텐소를 한번에 추출 할때 사용
import tensorflow as tf
import numpy as np
for x, y in zip([1, 2, 3], [4, 5, 6]): # x와 y에 담아서 처리
print(x, y)
결과
(1, 4)
(2, 5)
(3, 6)