17. 시냅스 가중치 적용하기


set_weights

tf.keras.layers 모듈의 모든 레이어는 set_weights() 메서드를 포함합니다.

set_weights() 메서드를 이용해서 미리 생성, 가공하거나, 불러온 가중치 값 (weights)들을 모델에 적용할 수 있습니다.

아래 예제에서는 임의의 가중치 값을 갖는 NumPy 어레이를 생성하고 모델에 적용해보겠습니다.


예제

import numpy as np
import tensorflow as tf

# 1. MNIST 데이터셋 임포트
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()

# 2. 데이터 전처리
x_train, x_test = x_train/255.0, x_test/255.0

# 3. 모델 구성
model = tf.keras.models.Sequential([
    tf.keras.layers.Flatten(input_shape=(28, 28)),
    tf.keras.layers.Dense(512, activation=tf.nn.relu),
    tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])

# 4. 웨이트 생성하기
weight0 = np.random.rand(784, 512) * 0.1
weight1 = np.zeros(512)
weight2 = np.random.rand(512, 10) * 0.05
weight3 = np.zeros(10)

weights = np.array([weight0, weight1, weight2, weight3])

# 5. 웨이트 적용하기
model.set_weights(weights)

print(model.get_weights())

생성한 가중치 값들이 모델에 적용됩니다.


설명

# 4. 웨이트 생성하기
weight0 = np.random.rand(784, 512) * 0.1
weight1 = np.zeros(512)
weight2 = np.random.rand(512, 10) * 0.05
weight3 = np.zeros(10)

weights = np.array([weight0, weight1, weight2, weight3])

각 레이어별로 적용할 가중치 값과 바이어스 값을 각각의 어레이로 만들었습니다.

NumPy의 random.rand() 함수를 이용해서

첫번째 레이어의 가중치 값은 0에서 0.1 사이의 임의의 값을 갖도록,

두번째 레이어의 가중치 값은 0에서 0.05 사이의 임의의 값을 갖도록 만들어주었습니다.

또한 NumPy의 zeros() 함수를 이용해서 바이어스 값은 모두 0으로 합니다.

그리고 네 개의 어레이를 하나의 NumPy 어레이로 합쳐 주었습니다.


# 5. 웨이트 적용하기
model.set_weights(weights)

이제 set_weights()를 이용해서 생성한 weights를 모델에 적용해줍니다.


print(model.get_weights())

시냅스 가중치 얻기 페이지에서 다루었던 get_weights() 메서드를 이용해서 모델의 가중치 값을 출력해보면

생성한 가중치 값들이 적용되어 있음을 알 수 있습니다.




바이어스 사용하지 않기

import numpy as np
import tensorflow as tf

# 1. MNIST 데이터셋 임포트
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()

# 2. 데이터 전처리
x_train, x_test = x_train/255.0, x_test/255.0

# 3. 모델 구성
model = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(input_shape=(28, 28)),
  tf.keras.layers.Dense(512, activation=tf.nn.relu, use_bias=False),
  tf.keras.layers.Dense(10, activation=tf.nn.softmax, use_bias=False)
])

weights = model.get_weights()

print(weights)
print(len(weights))
print(weights[0].shape)
print(weights[1].shape)
[array([[-0.00180037,  0.00632494,  0.05195455, ..., -0.01135769,
        -0.00360435, -0.00013197],
       [ 0.01351992, -0.00184936, -0.06347489, ...,  0.06174915,
        -0.04220404, -0.03083536],
       [ 0.0582615 ,  0.01855589, -0.06096812, ...,  0.0082844 ,
         0.05198504, -0.04045105],
       ...,
       [-0.01063943,  0.06117912, -0.0423585 , ..., -0.02725973,
        -0.0287867 , -0.02058563],
       [-0.031974  , -0.00435832,  0.01853658, ...,  0.06000179,
        -0.05476063, -0.03798168],
       [ 0.01977099,  0.05540701,  0.06362468, ...,  0.02298732,
         0.04441025, -0.04893865]], dtype=float32), array([[ 0.01927812, -0.08453314, -0.05655076, ...,  0.01809663,
        -0.02808041,  0.10296542],
       [ 0.01096758,  0.07996217, -0.02063442, ...,  0.05331417,
         0.01113722,  0.05506157],
       [-0.07804362, -0.01005847, -0.08122149, ...,  0.01433475,
         0.06766728, -0.1058412 ],
       ...,
       [-0.02241903, -0.07390198,  0.04372018, ...,  0.10399926,
        -0.04324216, -0.08352485],
       [ 0.01169502, -0.08287773, -0.03229887, ...,  0.07274764,
         0.07055562, -0.08828036],
       [ 0.0526795 ,  0.06339648, -0.09365696, ...,  0.01743795,
        -0.08578204,  0.0449848 ]], dtype=float32)]
2
(784, 512)
(512, 10)

각 레이어를 구성할 때, use_bias=False로 설정하면 바이어스를 나타내는 NumPy 어레이가 생성되지 않습니다.

모델의 시냅스 가중치를 출력해보면 (784, 512)와 (512, 10) 형태의 두 개의 NumPy 어레이가 생성되었음을 알 수 있습니다.

Matplotlib 라이브러리를 이용해서 시냅스 가중치 값을 히트맵으로 나타내보면 아래와 같습니다.


set_weights
set_weights



tf.keras.initializers.RandomNormal 사용하기

tf.keras.initializers.RandomNormal는 표준분포를 갖는 텐서 (tensor)를 생성합니다.

import numpy as np
import tensorflow as tf

# 1. MNIST 데이터셋 임포트
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()

# 2. 데이터 전처리
x_train, x_test = x_train/255.0, x_test/255.0

# 3. tf.keras.initializers.RandomNormal 사용하기
initializer1 = tf.keras.initializers.RandomNormal(mean=2.0, stddev=0.05, seed=None)
initializer2 = tf.keras.initializers.RandomNormal(mean=-2.0, stddev=0.01, seed=None)

# 4. 모델 구성
model = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(input_shape=(28, 28)),
  tf.keras.layers.Dense(512, activation=tf.nn.relu, use_bias=False, kernel_initializer=initializer1),
  tf.keras.layers.Dense(10, activation=tf.nn.softmax, use_bias=False, kernel_initializer=initializer2)
])

# 5. 시냅스 가중치 출력
weights = model.get_weights()
print(weights)

# 6. Matplotlib 시각화하기
import matplotlib.pyplot as plt

plt.hist(weights[0], bins=100, alpha=0.7, histtype='step')
plt.hist(weights[1], bins=100, alpha=0.7, histtype='step')
plt.show()
[array([[2.0707498, 2.0582442, 2.0279617, ..., 2.0003266, 1.9494209,
      1.9950501],
     [2.053631 , 1.9367449, 2.0498245, ..., 2.0626428, 2.077433 ,
      1.8980446],
     [1.9524959, 1.9671254, 2.0178082, ..., 2.0075676, 2.0454142,
      1.9336971],
     ...,
     [1.9904697, 1.9591775, 1.9642094, ..., 1.9809738, 2.011998 ,
      1.8940853],
     [2.0789752, 2.0541403, 1.989919 , ..., 1.9354533, 1.9982094,
      1.9887308],
     [1.9499259, 2.0538788, 1.9788142, ..., 2.0026433, 2.0417168,
      1.9619868]], dtype=float32), array([[-1.9974184, -1.9957153, -2.00028  , ..., -2.0191674, -2.0111377,
      -1.9899257],
     [-2.0003097, -2.018554 , -2.0133874, ..., -1.9968629, -2.0008864,
      -1.9960991],
     [-1.9808995, -1.9996533, -2.0080128, ..., -2.0065885, -1.9875172,
      -1.9999095],
     ...,
     [-1.9964446, -2.0137677, -1.9882427, ..., -2.0074763, -2.0203407,
      -2.0071764],
     [-2.0125241, -1.9982183, -2.0022962, ..., -2.022005 , -1.9981374,
      -1.9985487],
     [-2.009314 , -2.0061378, -2.0122364, ..., -1.9981507, -1.9900427,
      -1.9930578]], dtype=float32)]

tf.keras.layer 모듈의 각 레이어를 구성하면서 kernel_initializer 인자를 사용해서 미리 생성한 표준분포를 갖는 텐서를 모델의 시냅스 가중치로 적용했습니다.

Matplotlib 을 이용해서 히스토그램으로 나타내보면 아래와 같습니다.

각각 평균 2.0, 표준편차 0.05, 평균 -2.0, 표준편차 0.01인 시냅스 가중치 값들이 생성되었음을 알 수 있습니다.


set_weights



tf.keras.initializers.RandomUniform 사용하기

tf.keras.initializers.RandomUniform은 균등분포를 갖는 텐서 (tensor)를 생성합니다.

import numpy as np
import tensorflow as tf

# 1. MNIST 데이터셋 임포트
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()

# 2. 데이터 전처리
x_train, x_test = x_train/255.0, x_test/255.0

# 3. tf.keras.initializers.RandomNormal 사용하기
initializer1 = tf.keras.initializers.RandomUniform(minval=-0.05, maxval=0.05, seed=None)
initializer2 = tf.keras.initializers.RandomUniform(minval=-0.1, maxval=0.1, seed=None)

# 4. 모델 구성
model = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(input_shape=(28, 28)),
  tf.keras.layers.Dense(512, activation=tf.nn.relu, use_bias=False, kernel_initializer=initializer1),
  tf.keras.layers.Dense(10, activation=tf.nn.softmax, use_bias=False, kernel_initializer=initializer2)
])

# 5. 시냅스 가중치 출력
weights = model.get_weights()
print(weights)

# 6. Matplotlib 시각화하기
import matplotlib.pyplot as plt

plt.hist(weights[0], bins=100, alpha=0.7, histtype='step')
plt.hist(weights[1], bins=100, alpha=0.7, histtype='step')
plt.show()
[array([[-0.04813321,  0.03850188, -0.04333941, ...,  0.03577845,
      -0.02961006, -0.03295499],
     [-0.01708596,  0.0058869 , -0.00387685, ..., -0.02265617,
      -0.00891232, -0.03500197],
     [-0.04790206,  0.00961652, -0.03043391, ..., -0.0473738 ,
       0.00498282, -0.00555975],
     ...,
     [ 0.00313902, -0.03869805,  0.02545181, ..., -0.02569604,
       0.00126978,  0.01914135],
     [-0.00128641, -0.02937489,  0.04575497, ..., -0.02505137,
      -0.01237155, -0.01361365],
     [ 0.0145659 , -0.01967684, -0.02684872, ..., -0.04327303,
      -0.0002812 ,  0.01977504]], dtype=float32), array([[-0.07793639,  0.07992528,  0.07283423, ...,  0.04714014,
      -0.07861056,  0.08535979],
     [-0.01000409,  0.05313633,  0.09388087, ..., -0.04752097,
      -0.00120325,  0.04486213],
     [ 0.03404623,  0.03290916,  0.03367629, ...,  0.08172724,
       0.00491893, -0.00589781],
     ...,
     [ 0.06921809, -0.08647346, -0.06854935, ...,  0.06935558,
      -0.08771922,  0.07440331],
     [-0.05893927, -0.02979596, -0.08479095, ..., -0.06812584,
       0.00100436,  0.0872466 ],
     [-0.0245528 ,  0.06422883,  0.03848126, ..., -0.0373769 ,
      -0.0915236 , -0.01972015]], dtype=float32)]

tf.keras.initializers.RandomUniform의 minval, maxval은 균등분포의 범위를 지정합니다.

Matplotlib 라이브러리를 이용해서 히스토그램으로 나타내보면 아래와 같습니다.

각각 최소 -0.05, 최대 0.05, 그리고 최소 -0.1, 최대 0.1 범위를 갖는 임의의 시냅스 가중치가 생성되었음을 알 수 있습니다.


set_weights


이전글/다음글