1. Tensorflow에서 Tensor를 생성하는 방법

텐서플로에서 사용하는 주 자료구조가 텐서(Tensor)입니다. 텐서는 변수로 선언할 수도 있고, 데이터 투입 대상인 Placeholder로 선언할 수도 있습니다. 텐서를 생성하는 방법은 여러가지가 있습니다. 텐서를 생성하기 위한 여러가지 내장 함수를 살펴보도록 하겠습니다.


1. 고정 텐서

텐서플로에서 고정된 값으로 텐서를 생성하기 위한 방법은 아래와 같습니다.

tf.zeros()

0 값으로 채워진 텐서를 생성하기 위한 함수입니다.

1zeros_tensor = tf.zeros([row_dim, col_dim])

tf.ones()

1값으로 채워진 텐서를 생성하기 위한 함수입니다.

1ones_tensor = tf.ones([row_dim, col_dim])

tf.fill()

동일한 상수 값으로 채워진 텐서를 생성하기 위한 함수입니다.

1filled_tensor = tf.fill([row_dim, col_dim])

tf.constant()

기존 상수를 이용해 텐서를 생성하기 위한 함수입니다.

1constant_tensor = tf.constant([1, 2, 3])

2. 비슷한 값을 가지는 텐서

기존 텐서의 형태를 바탕으로 텐서 변수를 초기화하는 것도 가능합니다.

tf.zeros_like / tf.ones_like

1zeros_similar = tf.zeros_like(constant_tensor)
2ones_similar = tf.ones_like(constant_tensor)

3. 시퀀스 텐서

구간을 지정하는 방식으로 텐선을 선언할 수 있습니다.

tf.range()

정수 시퀀스 텐서를 생성합니다.

1# range(start, limit=None, delta=1, name='range')
2integer_sequence_tensor = tf.range(start=6, limit=15, delta=3)
  • start : 시퀀스의 시작값이며, 기본값은 0
  • limit : 시퀀스의 상한값이며, 시퀀스에 포함되지 않음
  • delta : start를 증가시키는 수
  • name : 연산의 명칭(선택)

tf.linspace()

일정 구간 사이의 값을 생성합니다.

1# linspace(start, stop, num, name=None)
2linear_tensor = tf.linspace(start=0, stop=1, num=3)
  • start : 시퀀스의 시작값
  • stop : 시퀀스의 상한값
  • num : 생성할 값들의 개수

4. 랜덤 텐서

난수 기반의 텐서를 생성하는 방법은 아래와 같습니다.

tf.random_uniform()

균등 분포를 따르는 난수를 생성합니다.

1# random_uniform(shape, minval=0, maxval=None, dtype=tf.float32, seed=None, name=None)
2randunif_tensor = tf.random_uniform([row_dim, col_dim], minval=0, maxval=1)
  • shape : 정수값의 D-1 텐서 또는 파이썬 배열 입력
  • minval : 난수값 생성 구간의 하한
  • maxval : 난수값 생성 구간의 상한
  • dtype : 반환값의 타입 설정 (float32, float64, int32, int64)
  • seed : 난수 시드값 설정에 사용
  • name : 연산의 명칭(선택)

tf.random_normal()

정규 분포를 따르는 난수를 생성합니다.

1# random_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)
2randnorm_tensor = tf.random_normal([row_dim, col_dim], mean=0.0, stddev=1.0)
  • shape : 정수값의 D-1 텐서 또는 파이썬 배열 입력
  • mean : 정규분포의 평균값
  • stddev : 정규분포의 표준 편차
  • dtype : 반환값의 타입 설정 (float32, float64, int32, int64)
  • seed : 난수 시드값 설정에 사용
  • name : 연산의 명칭(선택)

tf.truncated_normal()

지정한 평균에서 표준편차 2배 이내의 값을 생성합니다. 특정 범위에 속하는 정규 분포 임의의 값을 생성하고 싶은 경우 사용합니다.

1# truncated_normal(shape, mean, stddev=1.0, dtype=tf.float32, seed=None, name=None)
2runcnorm_tensor = tf.truncated_normal([row_dim, col_dim], mean=0.0, stddev=1.0])
  • shape : 정수값의 D-1 텐서 또는 파이썬 배열 입력
  • mean : 정규분포의 평균값
  • stddev : 정규분포의 표준 편차
  • dtype : 반환값의 타입 설정 (float32, float64, int32, int64)
  • seed : 난수 시드값 설정에 사용
  • name : 연산의 명칭(선택)

tf.random_shuffle()

배열 항목을 뒤섞을 때 사용합니다. random_shuffle() 함수는 값의 첫번째 차원을 기준으로 랜덤하게 섞어줍니다.

1# random_shuffle(value, seed=None, name=None)
2shuffled_output = tf.random_shuffle(input_tensor)
  • value : 입력 텐서

tf.random_crop(value, size, seed=None, name=None)

텐서를 주어진 사이즈만큼 랜덤하게 잘라내고 싶을 때 사용합니다.

1# random_crop(value, size, seed=None, name=None)
2cropped_output = tf.random_crop(input_tensor, crop_size)
  • value : 입력 텐서
  • size : 잘라내고 싶은 텐서의 사이즈


Tensorflow와 Algorithm Flow

구글 텐서플로를 사용하면 머신 러닝 문제를 아주 효과적으로 해결할 수 있습니다. 머신 러닝은 음성 인식, 자연어 처리, 영상 처리 등의 다양한 분야에서 사용되고 있습니다. 텐서플로가 동작하는 방식이 처음에는 낮설게 느껴질 수 있지만, 이러한 복잡한 계산 방식 덕분에 복잡한 알고리즘을 쉽게 개발할 수 있습니다.

텐서플로는 Linux, MacOS, Window를 지원합니다. 텐서플로의 핵심 코드들은 C++로 작성되어 있지만, Python으로 구현된 라이브러리만으로도 충분히 머신 러닝을 진행할 수 있습니다.


텐서플로 참고 사이트

  1. https://www.tensorflow.org/api_docs/python/
  2. https://www.tensorflow.org/tutorials

텐서플로 알고리즘의 흐름

  1. 데이터셋 생성
  2. 데이터 전처리
  3. 데이터셋 분할
  4. 머신 러닝 알고리즘 파라미터 설정
  5. 변수 및 플레이스홀더 초기화
  6. 모델 구조 정의
  7. 비용 함수(Loss Function) 선언
  8. 모델 초기화 및 학습
  9. 모델 평가
  10. 파라미터 재정의 (선택)
  11. 적용 및 결과 예측

데이터셋 생성

머신 러닝 뿐만 아니라 데이터 분석을 위해서는 데이터셋이 필요합니다. 데이터셋은 직접 생성하거나 외부에서 가져오는 방식으로 얻을 수 있습니다.

데이터 전처리

데이터 전처리는 머신 러닝을 진행하는 데 있어 아주 중요한 역할을 수행합니다. 대부분의 데이터셋은 머신 러닝을 진행하는데 적합한 형태로 제공되지 않기 때문에 적절한 형태로 변환할 필요성이 있습니다. 텐서플로는 데이터 전처리를 위한 다양한 내장 함수를 제공합니다.

데이터셋 분할

머신 러닝 알고리즘 테스트를 위해 일반적으로 Test Set과 Train Set으로 데이터를 구분합니다. 필요에 따라서는 알고리즘 매개변수의 조절이 필요하기 떄문에 매개변수의 최적 값을 정하기 위해 검증셋까지 구분하는 경우도 있습니다.

머신 러닝 알고리즘 파라미터 설정

일반적인 알고리즘에는 학습을 위해 다양한 파라미터가 존재하고, 파라미터에 따라 예측 결과가 변화합니다. 따라서, 학습을 진행하기 이전에 파라미터를 적절히 설정하는 것이 중요합니다.

변수 및 플레이스홀더 초기화

텐서플로는 수정할 수 있는 값과 수정할 수 없는 값이 있습니다. 텐서플로는 비용 함수를 최소화하는 최적화 과정에서 변수 값, 가중치(Weight)와 편향(Bias) 값을 조정합니다. 데이터를 플레이스 홀더 자리에 투입해 최적화를 진행합니다. 변수 및 플레이스 홀더의 크기와 타입을 모두 초기화 시점에 지정하여 처리 대상에 대한 정보를 텐서플로에 알려주어야 합니다. 또한, 텐서플로가 처리할 데이터의 타입도 알려주어야 합니다.
(*플레이스홀더(Placeholder)에 대한 설명은 추후에 진행하도록 하겠습니다.)

1a_var = tf.constant(42)
2x_input = tf.placeholder(tf.float32, [None, input_size])
3y_input = tf.placeholder(tf.float32, [None, num_classes])

모델 구조 정의

학습을 위한 모델을 정의해야 합니다. 모델 정의는 계산 그래프 생성을 통해 이루어 집니다. 텐서플로는 모델의 결과를 얻기 위해 특정 연산과 값을 변수 및 플레이스홀더에 지정해야 합니다.
(*계산 그래프에 대한 설명 또한 추후에 진행하도록 하겠습니다)

비용 함수 선언

모델을 정의한 이후 모델 평가를 진행해야 합니다. 이를 위해 비용 함수를 정의합니다. 비용 함수는 해당 모델이 예측한 값이 실제 값과 얼마나 차이가 있는지를 알려주는 중요한 요소입니다.

모델 초기화 및 학습

그래프 인스턴스를 생성하고 플레이스홀더에 데이터를 투입해 학습을 진행합니다.

모델 평가

구축한 모델이 얼마나 잘 예측하는지를 알아보기 위해 모델 평가를 진행합니다. Train set을 통해 학습한 모델이 Test set에서는 어떻게 예측하는지 파악합니다. 결과로서 모델의 과적합, 과소적합 등의 여부를 판단할 수 있습니다.

파라미터 재정의

필요에 따라서는 구축한 모델의 성능이 만족스럽지 않을 때 알고리즘의 매개변수를 변경하고 싶을 수 있습니다. 알고리즘의 매개변수를 조정해가며 모델의 성능을 향상시킵니다.

적용 및 결과 예측

새로운 데이터를 생성해보고 구축한 모델에 적용해보며 얼마나 잘 예측하는지 확인합니다.



+ Recent posts