TensorFlow

딥러닝 프레임워크 텐서플로우에 대해 알아봅니다.읽는데 4분 정도 걸려요.

Tensor

텐서플로우에서 사용하는 기본 자료형으로 다차원 배열이다.
텐서는 rank, shape, type의 세가지 속성을 갖는다.

  • rank

    231209-201955
    텐서의 차원수로 rank k는 k차원 배열이다.

  • shape

    231209-202047
    텐서의 구조로, 각 축에 텐서의 원소 개수를 알려준다.

  • type
    텐서의 구성원소의 자료형을 알려준다.

축(axis)


대괄호의 가장 바깥부터 0, 1, 2 축이 된다.

Flow

텐서를 데이터 플로우 그래프를 이용하여 계산 과정과 모델을 표현하게 된다.

  • Op(eration)
    하나 이상의 텐서를 받아 계산을 수행하고 결과를 하나 이상의 텐서로 변환

  • Session
    그래프를 실행하기 위한 객체(세션)

  • Variables

    그래프 실행 시 파라미터를 저장하고 갱신하기 위해 사용

    .py
    W = tf.Variable(tf.randon_normal([4, 1]), name="weight")
    b = tf.Variable(tf.randon_normal([1]), name="bias")
    
  • Placeholder

    데이터 플로우 그래프 실행 시 데이터(텐서)를 전달하기 위해 사용

    .py
    x = tf.placeholder(tf.float32)
    y = tf.placeholder(tf.float32)
    z = tf.multiply(x, y)
    sess.run(z, feed_dict=[x: 3, y: 4])
    

텐서 변환 연산

reshape

텐서의 원소를 새로운 shape에 맞게 배치합니다.

a = [[[1,2,3,4], [5,6,7,8]], [[9,10,11,12], [13, 14, 15, 16]], [[17,18,19,20], [21,22,23,24]]]
tf.shape(a) → [3, 2, 4]
tf.reshpae(a, [3, 8])
→ [[1,2,3,4,5,6,7,8], [9,10,11,12,13,14,15,16], [17,18,19,20,21,22,23,24]]

squeeze

텐서에서 크기가 1인 축을 제거합니다.

a = [[[1,2]], [[3,4]], [[5,6]]]
tf.shape(a) → [3, 1, 2]
tf.squeeze(a)
→ [[1,2], [3,4], [5,6]]

expand_dims

지정한 축 위치에 차원을 하나 추가합니다.

tf.expands_dims([[1,2,3], [4,5,6]], 0)
[[[1,2,3], [4,5,6]]]
tf.expands_dims([[1,2,3], [4,5,6]], 1)
→ [[[1,2,3]], [[4,5,6]]]

slice

텐서에서 일부분을 선택합니다.
slice(텐서, [축i 시작위치], [축i의 추출길이])

a = [[1,2,3,4,5,6,7], [8,9,10,11,12,13,14], [15,16,17,18,19,20,21]]
tf.slice(a, [0,2], [2,3])
→ [[3,4,5], [10,11,12]]

split

지정된 축을 분할개수로 분리합니다.
spilt(텐서, 분할개수, 축)

a = [[1,2,3,4], [5,6,7,8], [9,10,11,12], [13,14,15,16]]
tf.split(a, 2, 0)
→ [[[1,2,3,4], [5,6,7,8]], [[9,10,11,12], [13,14,15,16]]]
tf.split(a, 2, 1)
→ [[[1,2], [5,6], [9,10], [13,14]], [[3,4], [7,8], [11,12], [15,16]]]

concat

지정된 축 방향으로 두 텐서를 이어 붙힙니다.

a = [[1,2], [3,4]]
b = [[5,6], [7,8]]
tf.concat([a, b], 0)
→ [[1,2], [3,4], [5,6], [7,8]]
tf.concat([a, b], 1)
→ [[1,2,5,6], [3,4,7,8]]

reverse

지정된 축을 기준으로 원소를 역순으로 배열합니다.

a = [[1,2,3], [4,5,6]]
tf.reverse(a, [0])
→ [[4,5,6], [1,2,3]]
tf.reverse(a, [1])
→ [[3,2,1], [6,5,4]]
tf.reverse(a, [0, 1])
→ [[6,5,4], [3,2,1]]

transpose

지정된 축의 순서로 텐서를 transpose 합니다.
transpose(텐서, perm=[축])
(perm을 지정 안하면 [0, 1] 로 간주함)

a = [[1,2,3], [4,5,6]]
tf.transpose(a)
→ [[1,4], [2,5], [3,6]]
b = [[[1,2,3], [4,5,6]], [[7,8,9], [10,11,12]]]
tf.transpose(b, [0,2,1])
→ [[[1,4], [2,5], [3,6]], [[7,10], [8,11], [9,12]]]

gather

지정된 index의 원소들로 이루어진 텐서를 생성합니다.
gather(텐서, [index])

tf.gather([1,3,5,7,9,0,2,4,6,8], [2,5,2,5])
→ [5,0,5,0]
tf.gather([[1,2,3,4,5,6], [7,8,9,10,11,12]], [0,1])
→ [[1,2,3,4,5,6], [7,8,9,10,11,12]]
tf.gather([[1,2,3,4,5,6], [7,8,9,10,11,12]], [[0,0], [1,1]])
→ [[[1,2,3,4,5,6], [1,2,3,4,5,6]], [[7,8,9,10,11,12], [7,8,9,10,11,12]]]

ont_hot

정수값을 one-hot 벡터로 변환합니다.

tf.ont_hot([0,1,2], depth=3)
[[1.0, 0.0, 0.0], [0.0, 1.0, 0.0], [0.0, 0.0, 1.0]]
tf.ont_hot([0,1,2], depth=4)
[[1.0, 0.0, 0.0, 0.0], [0.0, 1.0, 0.0, 0.0], [0.0, 0.0, 1.0, 0.0]]


기타

텐서 축약 연산

231209-222217

텐서 행렬 연산

231209-222315