텐서플로우 원핫 벡터 생성 함수 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로 이루어진 벡터가 형성되었습니다.
'Python > Tensorflow' 카테고리의 다른 글
[Tensorflow] 과적합 방지 조기 종료 설정 : EarlyStopping (2) | 2022.02.18 |
---|---|
[Tensorflow] 텐서플로우 GPU 확인, 특정 GPU 사용 방법 (2) | 2022.02.07 |
[Tensorflow] 텐서플로우 버전 확인, 업그레이드, 다운그레이드 방법 (0) | 2022.01.21 |