Python/Tensorflow

[Tensorflow] 텐서플로우 원핫 인코딩 함수 : tf.one_hot()

jimmy_AI 2022. 1. 14. 14:22
반응형

텐서플로우 원핫 벡터 생성 함수 tf.one_hot() 사용법

안녕하세요. 이번 글에서는 파이썬 tensorflow에서

원핫 인코딩을 바로 진행할 수 있게 해주는 tf.one_hot 함수의 사용법에 대해서

간단히 다루어보도록 하겠습니다.

 

이 글은 텐서플로우 공식 문서의 tf.one_hot 함수 설명 글을 바탕으로 작성되었습니다.

 

원핫 인코딩(One-hot Encoding)이란?

원핫 인코딩은 딥러닝 과정에서 loss 함수 계산을 용이하게 해주어

학습의 효율을 증가시킬 수 있고,

범주형 변수를 머신러닝에 사용가능하게 만들어주는 방법입니다.

 

10장의 강아지, 고양이, 여우, 호랑이 사진들의 목록이 있다고 할 때,

이를 단일 벡터로 만든 경우와, 원핫 인코딩으로 표현한 결과는

아래 그림처럼 요약이 가능합니다.

원핫 인코딩이란 이처럼 [0, 3, 0, 1, 2, ...] 이라는 각 라벨에 해당하는 인덱스를

해당 위치만 1로 매핑하고, 나머지는 0으로 매핑한 벡터로 표현하는 방법입니다.

 

여기서는 텐서플로우에서 손쉽게 인덱스 벡터를 원핫 벡터로 바꾸는 방법을

소개해보도록 하겠습니다.

 

 

tf.one_hot 함수 기본 사용법

tf.one_hot 함수의 사용법은 tf.one_hot(라벨 인덱스 목록, 라벨 개수) 형태로

지정해주시면 완료됩니다.

import tensorflow as tf

idx = [0, 3, 0, 1, 2, 1, 3, 2, 1, 0]

tf.one_hot(idx, 4)

''' 실행 결과 : 

<tf.Tensor: shape=(10, 4), dtype=float32, numpy=
array([[1., 0., 0., 0.],
       [0., 0., 0., 1.],
       [1., 0., 0., 0.],
       [0., 1., 0., 0.],
       [0., 0., 1., 0.],
       [0., 1., 0., 0.],
       [0., 0., 0., 1.],
       [0., 0., 1., 0.],
       [0., 1., 0., 0.],
       [1., 0., 0., 0.]], dtype=float32)>
'''

위의 그림에서 보았던 예시 인덱스가 원핫 벡터로 잘 바뀌었습니다.

 

여기서 라벨 개수는 총 4가지였기에, 두 번째 인자를 4로 지정한 것이며,

depth = 4 처럼 depth 인자에 라벨 개수를 정해주셔도 무관합니다.

반응형

tf.one_hot dtype, axis, value 지정

tf.one_hot 함수는 dtype, axis, value를 따로 지정할 수 있는 옵션을 제공합니다.

 

먼저, tf.int32라는 정수형 자료로 데이터 타입을 지정한 예시입니다.

dtype 인자에 원하는 자료형을 지정해주시면 됩니다.

tf.one_hot(idx, depth = 4, dtype = tf.int32)

''' 실행 결과 :

<tf.Tensor: shape=(10, 4), dtype=int32, numpy=
array([[1, 0, 0, 0],
       [0, 0, 0, 1],
       [1, 0, 0, 0],
       [0, 1, 0, 0],
       [0, 0, 1, 0],
       [0, 1, 0, 0],
       [0, 0, 0, 1],
       [0, 0, 1, 0],
       [0, 1, 0, 0],
       [1, 0, 0, 0]], dtype=int32)>
'''

1., 0. 형태 대신 소수점이 사라지고 1, 0의 정수 형태로 숫자가 바뀌었습니다.

 

원 핫 벡터가 나열되는 축의 방향도 axis 인자를 통해 지정이 가능합니다.

axis = 0으로 지정한 예시를 위의 결과와 비교해보세요.

tf.one_hot(idx, depth = 4, axis = 0)

''' 실행 결과 : 

<tf.Tensor: shape=(4, 10), dtype=float32, numpy=
array([[1., 0., 1., 0., 0., 0., 0., 0., 0., 1.],
       [0., 0., 0., 1., 0., 1., 0., 0., 1., 0.],
       [0., 0., 0., 0., 1., 0., 0., 1., 0., 0.],
       [0., 1., 0., 0., 0., 0., 1., 0., 0., 0.]], dtype=float32)>
'''

각 원핫 벡터가 행 방향이 아닌 열 방향에 위치하게 되었습니다.

 

마지막으로, 기존의 1, 0이라는 on/off value의 값을

on_value, off_value라는 인자들로 각각 지정이 가능합니다.

 

예를 들어, 해당 라벨의 위치를 3, 아닌 경우를 -1로 나타내보겠습니다.

tf.one_hot(idx, depth = 4, on_value = 3, off_value = -1)

''' 실행 결과 : 

<tf.Tensor: shape=(10, 4), dtype=int32, numpy=
array([[ 3, -1, -1, -1],
       [-1, -1, -1,  3],
       [ 3, -1, -1, -1],
       [-1,  3, -1, -1],
       [-1, -1,  3, -1],
       [-1,  3, -1, -1],
       [-1, -1, -1,  3],
       [-1, -1,  3, -1],
       [-1,  3, -1, -1],
       [ 3, -1, -1, -1]], dtype=int32)>

'''

1과 0으로 이루어진 벡터 대신 3과 -1로 이루어진 벡터가 형성되었습니다.