Tensor 연산

yeoni·2023년 6월 27일
0

Tensorflow

목록 보기
3/15

1. 기본 연산

  • 기본 연산은 특수 메서드를 이용하여 연산자 오버로딩이 되어 있으므로 그냥 연산자 기호를 사용하는게 가능!
    tf.add: 덧셈
    tf.subtract: 뺄셈
    tf.multiply: 곱셈
    tf.divide: 나눗셈
    tf.pow: n-제곱
    tf.negative: 음수 부호
import tensorflow as tf

a = tf.range(6, dtype=tf.int32)   
b = 2 * tf.ones(6, dtype=tf.int32)

tf.add(a, b)
a + b

2. 여러가지 연산

  • tf.abs: 절대값
  • tf.sign: 부호
  • tf.round: 반올림
  • tf.ceil: 올림
  • tf.floor: 내림
  • tf.square: 제곱
  • tf.sqrt: 제곱근
  • tf.maximum: 두 텐서의 각 원소에서 최댓값만 반환.
  • tf.minimum: 두 텐서의 각 원소에서 최솟값만 반환.
  • tf.cumsum: 누적합
  • tf.cumprod: 누적곱

3. Axis

rank_2 = tf.random.normal((3, 3))
'''
<tf.Tensor: shape=(3, 3), dtype=float32, numpy=
array([[ 1.0219942 ,  0.8496209 , -0.12634476],
       [-0.36742872, -0.9638588 ,  0.86198586],
       [ 1.2553971 , -0.3270209 , -0.65407085]], dtype=float32)>
'''

rank_2[0]
# <tf.Tensor: shape=(3,), dtype=float32, numpy=array([ 1.0219942 ,  0.8496209 , -0.12634476], dtype=float32)>

rank_2[0, 0] #axis, index
# <tf.Tensor: shape=(), dtype=float32, numpy=1.0219942>

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

rank_3 = tf.random.normal((3, 3, 3))
'''
<tf.Tensor: shape=(3, 3, 3), dtype=float32, numpy=
axis=0, index=0
array([[[ 1.0201453 ,  0.10598245,  1.6207016 ],axis=0, index=0
        [-0.71964407, -0.8997607 , -1.5360591 ],
        [ 1.0973806 , -1.2254598 ,  1.0305752 ]],

       [[ 1.3389021 , -0.2408786 , -0.8961792 ],
        [-0.28417823,  2.3027785 , -0.6820288 ],
        [-0.5578357 , -0.15919904,  1.4385182 ]],

       [[-1.3937014 , -2.959658  , -0.138779  ],
        [-1.5080395 , -0.52344275, -0.5894229 ],
        [-0.01310016,  0.5227121 ,  1.9863173 ]]], dtype=float32)>
'''
rank_3[1, 1, 2]
# <tf.Tensor: shape=(), dtype=float32, numpy=-0.6820288>

3. 차원 축소

  • tf.reduce_mean: 설정한 축의 평균을 구한다.
  • tf.reduce_max: 설정한 축의 최댓값을 구한다.
  • tf.reduce_min: 설정한 축의 최솟값을 구한다.
  • tf.reduce_prod: 설정한 축의 요소를 모두 곱한 값을 구한다.
  • tf.reduce_sum: 설정한 축의 요소를 모두 더한 값을 구한다.
tf.reduce_sum(a, axis=0)

#keepdims=True 차원을 줄이는 연산을 하지만 유지하고 싶을 때 사용
tf.reduce_sum(a, axis=0, keepdims=True)

b = tf.random.normal((2,7))
tf.reduce_mean(b, axis=1) #평균값 2개로
tf.reduce_mean(b, axis=0) #평균값 7개로

4. 행렬과 관련된 연산

  • tf.matmul: 내적
  • tf.linalg.inv: 역행렬
a = tf.constant([[2, 0], [0, 1]], dtype=tf.float32)
b = tf.constant([[1, 1], [1, 1]], dtype=tf.float32)
tf.matmul(a, b)

tf.linalg.inv(a)

5. 크기 및 차원을 바꾸기

  • tf.reshape: 벡터 행렬의 크기 변환
  • tf.transpose: 전치 연산
  • tf.expand_dims: 지정한 축으로 차원을 추가
  • tf.squeeze: 벡터로 차원을 축소
a = tf.range(6, dtype=tf.int32)      # [0, 1, 2, 3, 4, 5]

a_2d = tf.reshape(a, (2, 3))  # 1차원 벡터는 2x3 크기의 2차원 행렬로 변환

a_2d_t = tf.transpose(a_2d)   # 2x3 크기의 2차원 행렬을 3x2 크기의 2차원 행렬로 변환

a_3d = tf.expand_dims(a_2d, 0) # 2x3 크기의 2차원 행렬을 1x2x3 크기의 3차원 행렬로 변환

a_4d = tf.expand_dims(a_3d, 3) # 1x2x3 크기의 3차원 행렬을 1x2x3x1 크기의 4차원 행렬로 변환
# a_4d = tf.expand_dims(a_3d, -1)

a_1d = tf.squeeze(a_4d) # 1x2x3x1 크기의 4차원 행렬을 1차원 벡터로 변환
# 원소 한개인 차원을 줄여준다. a_1d = tf.squeeze(a_4d, axis=0), a_1d = tf.squeeze(a_4d, axis=3) 원소가 한 개가 아니라 에러 

6. 텐서를 나누거나 두 개 이상의 텐서를 합치기

  • tf.slice: 특정 부분을 추출
  • tf.split: 분할
  • tf.concat: 합치기
  • tf.tile: 복제-붙이기
  • tf.stack: 합성
  • tf.unstack: 분리
a = tf.reshape(tf.range(12), (3, 4))
'''
<tf.Tensor: shape=(3, 4), dtype=int32, numpy=
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]], dtype=int32)>
'''

tf.slice(a, [0, 1], [2, 3])   # (0, 1)위치에서 (2개, 3개)만큼 뽑아낸다.?

a1, a2 = tf.split(a, num_or_size_splits=2, axis=1)  # 가로축(axis=1)을 따라 2개로 분할

tf.concat([a1, a2], 1) # 가로축(axis=1)을 따라 a1, a2를 합치기

tf.tile(a1, [1, 3])  # 가로축(axis=1)을 따라 3개로 복사-붙이기

a3 = tf.stack([a1, a2])  # 3x2 행렬 a1, a2를 추가적인 차원으로 붙여서 2x3x2 고차원 텐서 생성

tf.unstack(a3, axis=1)  # 2x3x2 고차원 텐서를 0차원으로 풀어서 3개의 2x2 행렬 생성

에러없이 다음 코드 실행하기

  • tf.matmul(a, b)
a = tf.constant(((1, 2, 3), (1, 2, 3)))
b = tf.constant([1, 2, 3])

tf.matmul(a, tf.expand_dims(b, axis=1))

Reference
1) 제로베이스 데이터스쿨 강의자료

profile
데이터 사이언스 / just do it

0개의 댓글