[TensorFlow] 텐서플로우의 다섯 가지 Initializer

TensorFlow에서 제공하는 다섯 가지 Initializer에 대해 소개합니다.

Initializer는 형태 (shape)와 자료형 (dtype)이 정해지지 않았을 때 Tensor를 생성하는 방식을 미리 설정하도록 합니다.





tf.constant_initializer

tf.constant_initializer는 특정 상수값을 갖는 Tensor를 생성하는 방식입니다.


예제1

import tensorflow as tf

initializer = tf.constant_initializer(value=0.5)

a = tf.Variable(initializer(shape=[3, 3], dtype=tf.float32))
print(a)
print(a.numpy())
<tf.Variable 'Variable:0' shape=(3, 3) dtype=float32, numpy=
array([[0.5, 0.5, 0.5],
     [0.5, 0.5, 0.5],
     [0.5, 0.5, 0.5]], dtype=float32)>
[[0.5 0.5 0.5]
[0.5 0.5 0.5]
[0.5 0.5 0.5]]

tf.constant_initializervalue를 스칼라 값으로 지정하면 생성되는 Tensor의 모든 값이 value 값으로 설정됩니다.



예제2

import tensorflow as tf

initializer = tf.constant_initializer(value=[0, 1, 2, 3, 4, 5])

a = tf.Variable(initializer(shape=[2, 3], dtype=tf.float32))
print(a)
print(a.numpy())
<tf.Variable 'Variable:0' shape=(2, 3) dtype=float32, numpy=
array([[0., 1., 2.],
     [3., 4., 5.]], dtype=float32)>
[[0. 1. 2.]
[3. 4. 5.]]

tf.constant_initializervalue를 리스트 [0, 1, 2, 3, 4, 5]로 지정했습니다.

생성하는 Tensor의 형태가 (2, 3)이라면 각각의 값을 갖는 Tensor가 만들어집니다.

리스트의 각 값을 할당할 수 없는 형태를 지정하면 에러를 발생합니다.





tf.ones_initializer

tf.ones_initializer는 1을 갖는 Tensor를 생성하는 방식입니다.


예제

import tensorflow as tf

initializer = tf.ones_initializer()

a = tf.Variable(initializer(shape=[3], dtype=tf.float32))
b = tf.Variable(initializer(shape=[3, 3], dtype=tf.int32))

print(a)
print(a.numpy())

print(b)
print(b.numpy())
<tf.Variable 'Variable:0' shape=(3,) dtype=float32, numpy=array([1., 1., 1.], dtype=float32)>
[1. 1. 1.]
<tf.Variable 'Variable:0' shape=(3, 3) dtype=int32, numpy=
array([[1, 1, 1],
     [1, 1, 1],
     [1, 1, 1]], dtype=int32)>
[[1 1 1]
[1 1 1]
[1 1 1]]

tf.ones_initializer를 사용해서 주어진 형태와 자료형을 갖고, 모든 값이 1인 Tensor를 생성했습니다.





tf.zeros_initializer

tf.zeros_initializer는 0을 갖는 Tensor를 생성하는 방식입니다.


예제

import tensorflow as tf

initializer = tf.zeros_initializer()

a = tf.Variable(initializer(shape=[3], dtype=tf.float32))
b = tf.Variable(initializer(shape=[3, 3], dtype=tf.int32))

print(a)
print(a.numpy())

print(b)
print(b.numpy())
<tf.Variable 'Variable:0' shape=(3,) dtype=float32, numpy=array([0., 0., 0.], dtype=float32)>
[0. 0. 0.]
<tf.Variable 'Variable:0' shape=(3, 3) dtype=int32, numpy=
array([[0, 0, 0],
     [0, 0, 0],
     [0, 0, 0]], dtype=int32)>
[[0 0 0]
[0 0 0]
[0 0 0]]

tf.zeros_initializer를 사용해서 주어진 형태와 자료형을 갖고, 모든 값이 0인 Tensor를 생성했습니다.





tf.random_normal_initializer

tf.random_normal_initializer는 주어진 평균 (mean)과 표준편차 (stddev)를 갖는 정규분포로부터 샘플링된 값을 갖는 Tensor를 생성하는 방식입니다.


예제

import tensorflow as tf
import matplotlib.pyplot as plt

initializer1 = tf.random_normal_initializer(mean=0.0, stddev=0.05, seed=0)
initializer2 = tf.random_normal_initializer(mean=0.2, stddev=0.05, seed=1)

a = tf.Variable(initializer1(shape=[10, 100], dtype=tf.float32))
b = tf.Variable(initializer2(shape=[10, 100], dtype=tf.float32))

# print(a.numpy())
# print(b.numpy())

plt.hist(a.numpy().flatten())
plt.hist(b.numpy().flatten())
plt.show()

tf.random_normal_initializer를 사용해서 [10, 100] 형태와 tf.float32 자료형을 갖는 Tensor를 만들었습니다.

Tensor의 값들은 주어진 평균과 표준편차를 갖는 정규분포로부터 샘플링되었습니다.

seed를 사용해서 난수 생성의 재현성을 지정할 수 있습니다.

Matplotlib 히스토그램을 사용해서 시각화하면 아래와 같은 분포를 가짐을 알 수 있습니다.


[TensorFlow] 텐서플로우의 다섯 가지 Initializer




tf.random_uniform_initializer

tf.random_uniform_initializer는 주어진 최대값 (maxval), 최소값 (minval)을 갖는 균등분포로부터 샘플링된 값을 갖는 Tensor를 생성하는 방식입니다.


예제

import tensorflow as tf
import matplotlib.pyplot as plt

initializer1 = tf.random_uniform_initializer(minval=-0.1, maxval=0.2, seed=0)
initializer2 = tf.random_uniform_initializer(minval=0.0, maxval=0.3, seed=1)

a = tf.Variable(initializer1(shape=[10, 100], dtype=tf.float32))
b = tf.Variable(initializer2(shape=[10, 100], dtype=tf.float32))

# print(a.numpy())
# print(b.numpy())

plt.hist(a.numpy().flatten(), histtype='step')
plt.hist(b.numpy().flatten(), histtype='step')
plt.show()

tf.random_uniform_initializer를 사용해서 [10, 100] 형태와 tf.float32 자료형을 갖는 Tensor를 만들었습니다.

Tensor의 값들은 주어진 최대값, 최소값을 갖는 균등분포로부터 샘플링되었습니다.

seed를 사용해서 난수 생성의 재현성을 지정할 수 있습니다.

Matplotlib 히스토그램을 사용해서 시각화하면 아래와 같은 분포를 가짐을 알 수 있습니다.


[TensorFlow] 텐서플로우의 다섯 가지 Initializer


이전글