[도서완독]Hands On Machine Learning
[HandsOn]12. 텐서플로를 사용한 사용자 정의 모델과 훈련 - 연습문제 풀이
입짧은달님
2022. 7. 21. 17:00
12. 층 정규화(layer normalization)을 수행하는 사용자 정의 층을 구현하세요.
a. build() 메서드에서 두 개의 훈련 가능한 가중치 a와 b를 정의합니다. 두 가중치 모두 크기가 input_shape[-1:]이고 데이터 타입은 tf..float32 입니다. a는 1로 초기화되고 b는 0으로 초기화되어야 합니다.
b. call()메서드에서는 샘플의 특성마다 평균 \mu와 표준편차 \sigma를 계산해야 합니다. 이를 위해 전체 샘플의 평균과 분산을 반환하는 tf.nn.moments(inputs,axes=-1, keepdims=True)을 사용할 수 있습니다. 그다음 α⊗(X - μ)/(σ + ε) + β 를 계산하여 반환합니다.
c. 사용자 정의 층이 keras.layers.LayerNormalization 층과 동일한(또는 거의 동일한) 출력을 만드는지 확인하세요.
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.layers import Layer
import numpy as np
#%%
#층 정규화를 수행하는 사용자 정의 층을 구현하세요.
class custom_normalization(Layer):
def __init__(self,**kwargs):
super().__init__(**kwargs)
def build(self, batch_input_shape):
self.a = self.add_weight(
name='kernel', shape=batch_input_shape[-1:],
initializer = 'ones'
)
self.b = self.add_weight(
name='bias', shape= batch_input_shape[-1:], initializer='zeros'
)
super().build(batch_input_shape)
def call(self, X):
mu,sigma=tf.nn.moments(X,axes=-1,keepdims=True)
return self.a*(X-mu)/(tf.sqrt(sigma+1e-6))+self.b
def comput_output_shape(self, batch_input_shape):
return batch_input_shape
특별할 건 없고 keras 의 사용자 정의 층 형식에 따라 만들었다.
여기서는 문제에서 힌트를 다 줘서 쉬웠는데 내가 아무것도 없는 상태에서 만들려면 어려울 듯....
#사용자 정의 층이 keras.layers.LayerNormalization 층과 거의 동일한 출력을 만드는지 확인하세요.
(X_train_full, y_train_full), (X_test, y_test) = keras.datasets.fashion_mnist.load_data()
X_train_full = X_train_full.astype(np.float32) / 255.
X_valid, X_train = X_train_full[:5000], X_train_full[5000:]
y_valid, y_train = y_train_full[:5000], y_train_full[5000:]
X_test = X_test.astype(np.float32) / 255.
custom_layer_norm = custom_normalization()
keras_layer_norm = keras.layers.LayerNormalization()
X = X_train.astype(np.float32)
tf.reduce_mean(keras.losses.mean_absolute_error(keras_layer_norm(X), custom_layer_norm(X)))