1. Hyperparameter tuning, Batch Normalization, Programming Frameworks
- hyperparameters의 숫자가 적으면 grid search를 해도 될까?
- 아니다. hyperparameter 숫자가 적다고 하더라도 특정 parameter가 다른 parameter에 비해 지배적인 영향력을 줄 수 있기 때문이다.
- 우선순위가 높은 hyperparameter 두 개를 고르시오
- learning rate alpha, momentum의 beta(학습 속도에 영향을 주게 됨)
- hyperparameter search를 baby sit(판다 버전) 스타일로 할 것인가? 여러 모델을 parallel(캐비어 버전)하게 돌릴 것인가?
- 가지고 있는 자원(컴퓨터)에 달린 문제!
- 최적의 hyperparameters value를 찾았다면 새로운 computing 환경에서는 어떻게 해야 할까?
- 당연히 조정할 필요가 있다!
- normalization 과정에서 평균을 빼기 때문에 parameter W를 forward 연산에서 제외하는 것은 타당할까?
- 관련 없는 이야기이다.
- batch noramlization이 유용한 것은 internal covariance를 줄여주기 때문이다?
- 그렇다. convariance shift라고도 하는 이 현상은, train / test set의 분포가 다르기 때문에 발생한다.
이를 방지할 수 있는 방법 중 하나가 batch normalization이다.
- 그렇다. convariance shift라고도 하는 이 현상은, train / test set의 분포가 다르기 때문에 발생한다.
- batch normalization에 사용되는 parameters gamma, beta는 학습 대상인가?
- 그렇다. 여러 function들을 이용하여 그 값을 update한다.
- Batch Norm을 사용하여 학습된 모델을 test할 때는 어떻게 해야 할까?
- exponentially weighted average를 이용한다.
- deep learning framework를 선정하는 중요한 기준은 무엇인가?
- Running speed!
2. TensorFlow Introduction (Programming Assignment)
Linear function : Y = WX + b
X = tf.constant(np.random.randn(3,1), name = "X")
W = tf.constant(np.random.randn(4,3), name = "W")
b = tf.constant(np.random.randn(4,1), name = "b")
Y = tf.add(tf.matmul(W,X),b)
- tf.constant 함수를 사용하여 특정 사이즈의 변수를 생성할 수 있다. tf.Variable과 달리 변경이 불가능한 객체를 생성하는 것이다.
- tf.matmul은 행렬곱, tf.add는 행렬합을 지원하는 함수이다.
Sigmoid
def sigmoid(z):
z = tf.cast(z,tf.float32)
a = tf.keras.activations.sigmoid(z)
return a
- tf.cast 함수를 이용하여 변수 z를 float32 자료형으로 바꿔준다.
- tf.keras.activations.sigmoid 함수를 사용하여 변수 z를 바로 sigmoid 함수의 입력으로 제공한다.
One-hot matrix
def one_hot_matrix(label, depth=6):
one_hot = tf.reshape(tf.one_hot(label,depth), shape=[-1,])
return one_hot
- tf.one_hot 함수를 사용하면 one_hot 벡터를 만들 수 있다.
이때 depth를 제공해야 해당 기존 vector(label)에서 가장 큰 값이 몇 개의 class(depth) 중 하나인지 알 수 있게 된다.
위 예시에서는 총 6개의 클래스에 대한 one_hot_matrix를 만드는 것이 default인 것으로 이해할 수 있다. - tf.reshape 함수를 사용하면 tensor의 size를 조정할 수 있다.
one_hot_matrix는 각 행에 대하여 하나의 열만 활성화된 형태이므로 전체 개수를 2차원에 맞춘 형태라고 이해 가능하다.
Initialize the Parameters
def initialize_parameters():
initializer = tf.keras.initializers.GlorotNormal(seed=1)
W1 = tf.Variable(initializer(shape=(25,12288)))
b1 = tf.Variable(initializer(shape=(25,1)))
W2 = tf.Variable(initializer(shape=(12,25)))
b2 = tf.Variable(initializer(shape=(12,1)))
W3 = tf.Variable(initializer(shape=(6,12)))
b3 = tf.Variable(initializer(shape=(6,1)))
return parameters
- tf.keras.initializers.GlorotNormal(seed=) 을 이용하면 random seed를 기준으로 초기화 할 수 있다.
즉, seed가 동일한 경우 어떻게 초기화해도 그 초깃값이 동일하다는 뜻이다. - 나머지는 tf.Variable(initializer)를 이용하여 tensor의 shape만 맞추어 주면 된다.
forward_propagation
def forward_propagation(X, parameters):
W1 = parameters['W1']
b1 = parameters['b1']
W2 = parameters['W2']
b2 = parameters['b2']
W3 = parameters['W3']
b3 = parameters['b3']
Z1 = tf.math.add(tf.linalg.matmul(W1,X),b1)
A1 = tf.keras.activations.relu(Z1)
Z2 = tf.math.add(tf.linalg.matmul(W2,A1),b2)
A2 = tf.keras.activations.relu(Z2)
Z3 = tf.math.add(tf.linalg.matmul(W3,A2),b3)
A3 = tf.keras.activations.relu(Z3)
return Z3
- 세 번의 linear function과 activation function을 거치는 과정을 하드 코딩한 결과는 위와 같다.
- tf.math.add는 두 tensor의 합을 계산해준다.
- tf.linalg.matmul은 두 tensor의 곱을 계산해준다.
- tf.keras.activations.relu는 activation function ReLU를 계산해준다.
compute_total_loss
def compute_total_loss(logits, labels):
total_loss = 2*tf.reduce_mean(tf.keras.metrics.categorical_crossentropy(tf.transpose(labels),tf.transpose(logits),from_logits=True))
return total_loss
- tf.keras.metrics.categorical_crossentropy(labels, predicts) 함수는 label과 predict 간의 cross entropy를 구해준다.
이때 입력되는 label과 predict의 shape은 (number of examples, num_classes) 이므로 위 예시에서는 transpose를 취해 모양을 맞춰준다. - tf.reduce_mean 함수를 사용하면 인자로 받는 tensor 내의 값을 전부 더한 값을 반환한다.
- 이 코드를 어떤 식으로 입력하더라도 정답 처리가 되지 않아서 굉장히 답답했었는데 reduce_mean에 2를 곱한 것이 정답이었다.
expected output이 내가 구한 result의 딱 두배라는 걸 알고 정답을 맞힐 수 있었다.
하지만 왜 2를 곱해야 하는지에 대해서는 추가적인 설명이 없어서 아쉽다. - 이후에는 지금까지 정리한 코드들을 한 데 묶어 학습을 돌려보고 그 결과를 확인하는 것밖에 없다.
출처: Coursera, Improving Deep Neural Networks, DeepLearning.AI
'Improving Deep Neural Networks > 3주차' 카테고리의 다른 글
Introduction to Programming Frameworks (0) | 2022.12.30 |
---|---|
Multi-class Classification (0) | 2022.12.24 |
Batch Normalization (0) | 2022.12.22 |
Hyperparameter Tuning (0) | 2022.12.18 |