SW/딥러닝

12. 딥러닝 : 텐서플로우 2.0 예제 : 결과 해석과 가중치와 바이어스 추출

얇은생각 2020. 2. 29. 07:30
반응형

텐서플로우 2.0

 

# 문제에 대한 관련 라이브러리를 항상 가져와야합니다.
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf

# 먼저, 생성하고자하는 훈련 세트의 크기를 포함하는 변수를 선언해야합니다.
observations = 1000

# 입력으로 두 개의 변수를 사용할 것입니다. 
# 이전 예제에서 x1과 x2로 생각할 수 있습니다.
# 우리는 x와 z를 구분하기가 쉽기 때문에 선택했습니다.
# 균일 한 분포로 그림을 무작위로 생성합니다. 
# 이 방법에는 3 가지 인수 (낮음, 높음, 크기)가 있습니다.
# xs와 zs의 크기는 관측치 x 1입니다.이 경우 : 1000 x 1입니다.
xs = np.random.uniform(low=-10, high=10, size=(observations,1))
zs = np.random.uniform(-10, 10, (observations,1))

# 입력의 2 차원을 하나의 입력 행렬로 결합합니다.
# 선형 모델 y = x * w + b의 X 행렬입니다.
# column_stack은 Numpy 메소드로, 두 개의 행렬 (벡터)을 하나로 결합합니다.
generated_inputs = np.column_stack((xs,zs))

# 함수에 임의의 작은 노이즈를 추가합니다 (예 : f (x, z) = 2x-3z + 5 + <작은 노이즈>
noise = np.random.uniform(-1, 1, (observations,1))

# f (x, z) = 2x-3z + 5 + 노이즈 정의에 따라 대상을 생성하십시오.
# 이런 식으로 : 가중치는 2와 -3이어야하고, 바이어스는 5입니다.
generated_targets = 2*xs - 3*zs + 5 + noise

# "TF_intro"라는 npz 파일로 저장
np.savez('TF_intro', inputs=generated_inputs, targets=generated_targets)

# NPZ에서 훈련 데이터를 로드
training_data = np.load('TF_intro.npz')

# 모델의 입력 크기를 저장할 변수를 선언하십시오
# 가지고있는 변수의 수와 같아야합니다
input_size = 2

# 모델의 출력 크기를 선언하십시오
# 가지고 있는 출력의 수와 같아야합니다 (일반적으로 1의 회귀)
output_size = 1

# 모델 개요
# 'Sequential'에서 모델을 배치합니다
model = tf.keras.Sequential([
                            # Each 'layer' is listed here
                            # The method 'Dense' indicates, our mathematical operation to be (xw + b)
                            tf.keras.layers.Dense(output_size,
                                                 # there are extra arguments you can include to customize your model
                                                 # in our case we are just trying to create a solution that is 
                                                 # as close as possible to our NumPy model
                                                 kernel_initializer=tf.random_uniform_initializer(minval=-0.1, maxval=0.1),
                                                 bias_initializer=tf.random_uniform_initializer(minval=-0.1, maxval=0.1)
                                                 )
                            ])


# 학습 속도를 지정할 수있는 맞춤 최적화 도구를 정의 할 수도 있습니다.
custom_optimizer = tf.keras.optimizers.SGD(learning_rate=0.02)

# 때로는 커스텀 손실 기능이 필요할 수도 있습니다.
# 구현하기가 훨씬 어렵지만이 과정에서는 다루지 않습니다.

# '컴파일'은 옵티 마이저 및 손실을 선택하고 표시합니다.
model.compile(optimizer=custom_optimizer, loss='mean_squared_error')

# 마지막으로 우리는 입력과 목표를 나타내는 모델에 적합합니다.
# 다르게 지정되지 않은 경우 에포크 수가 1 (단일 교육 에포크)이됩니다.
# epoch 수는 제한은 없습니다. 
# verbose = 2를 선호합니다
model.fit(training_data['inputs'], training_data['targets'], epochs=100, verbose=2)

# 가중치와 바이어스 추출은 아주 쉽게 이루어집니다
model.layers[0].get_weights()

# 우리는 가중치와 바이어스를 별도의 변수로 저장하여 쉽게 검사 할 수 있습니다
# 수백 또는 수천 개가 있을 수 있습니다!
weights = model.layers[0].get_weights()[0]
bias = model.layers[0].get_weights()[1]


# 실제로 모델을 사용하기 위해 새로운 값을 예측할 수 있습니다
# 때때로 출력을 읽을 수 있도록 값을 반올림하는 것이 유용합니다
# 일반적으로이 방법은 원래 교육 데이터가 아닌 NEW DATA에서 사용됩니다.
model.predict_on_batch(training_data['inputs']).round(1)

# 목표 (실제 관찰 값)를 표시하면 출력과 목표를 수동으로 비교할 수 있습니다
training_data['targets'].round(1)


# 모델이 최적화되었으므로 출력은 모델의 마지막 형식을 기반으로 계산됩니다.

# 우리는 배열을 플롯 함수가 기대하는 것에 맞추기 위해 np.squeeze해야합니다.
# 1의 크기로 자르면 아무런 변화가 없습니다.
plt.plot(np.squeeze(model.predict_on_batch(training_data['inputs'])), np.squeeze(training_data['targets']))
plt.xlabel('outputs')
plt.ylabel('targets')
plt.show()

 

학습 속도는 최적화 프로그램의 핵심 부분입니다. 여기에서 기본 확률적 경사 하강 또는 SGD를 사용했습니다.

실제로 변수를 만들 수도 있습니다.

문제가 훨씬 복잡하기 때문에 향후 손실을 사용자가 직접 정의하지 않고 내장된 손실 함수를 사용합니다. 신경망에 푹 빠져 새로운 손실 함수를 시도하고 싶을 수도 있습니다. 다음에 기회가 되면 활용해보도록 하겠습니다.

이러한 방식으로 모델을 훈련 시키십시오. 편중치 역시 잘 나오는 것을 확인할 수 있습니다. 출력은 배열뿐만 아니라 타겟에 가깝습니다.

아주 기본적인 예제를 진행해보았습니다. 이러한 기본적인 틀에서 벗어나지 않는다고 생각합니다. 이 예제에서 더욱 확장시켜보는 것을 추천드립니다.

반응형