기술 정보

[Tensorflow] NN 설계를 위한 tensorflow 기본 함수들

junmukbap98 2023. 9. 19. 22:19

모든 설명은 tensorflow 공식 문서를 활용했슴다. 추가 참조는 링크를 달아놓겠습니다.

import tensorflow as tf

 

1. tf.data.Dataset.from_tensor_slices

: 어떤 tensor가 주어졌을 때 dataset의 elements들을 slice해서 return 해주는 함수

x_train = tf.data.Dataset.from_tensor_slices(train_dataset['train_set_x'])
y_train = tf.data.Dataset.from_tensor_slices(train_dataset['train_set_y'])

 

2. x_train.element_spec

: x_train dataset의 각 요소들의 type specification을 보여준다. (shape, dtype, name)

이 전에 Pytorch만 이용했어서 그런지, tensorflow가 좀 더 어렵게 느껴지는 것 같다.. torch 쓸 때는 print(x_train[0].shape) 해서 shape을 확인했었는뎁..

 

3. tf.cast(x, dtype=tf.float32)

: tensor의 dtype을 변환해준다.

 

4. x_train.map(function)

: 데이터셋에 transformation function을 적용하고 싶을 때 사용

 

5. EagerTensor란?

기준에 따라서 즉각적으로 추정되는 tensor type을 말한다. [참조]

 

6. tf.one_hot(indices, depth, on_value, off_value, axis, dtype, name)

- indices: label을 집어넣으면 된다. 

- depth: one-hot vector의 length. class 개수를 넣으면 된다. 

- on_value: 정답 클래스를 표시할 때 사용할 값 (one-hot이니까 대부분 1로 사용하는 듯 하다.)

- off_value: 정답 외의 클래스를 표시할 때 사용할 값 (0)

- axis: 어느 방향으로 one-hot vecotr를 만들지. (axis=0이면 수직방향으로 만들어지고, axis=-1이면 수평방향으로 만들어짐)

 

7. tf.linalg.matmul(A, B)

: tensor A와 B를 곱해준다. 주의! tf.linalg.matmul(B, A)와 다르다! 차원이 안맞을 경우 오류 메세지가 뜬다. 

 

8. tf.math.add(A, B)

tensor A와 B를 더해준다. (broad casting 가능)

 

9. tf.keras.metrics.categorical_crossentropy(y_true, y_pred, from_logits=False, label_smoothing=0.0, axis=-1)

- from_logits: y_pred가 logits이면 True로 바꾸고, 아니면 (즉, model에서 softmax를 거쳤다면) False

- non-target labels 값에 대해 num_classes로 나눠준다. (x/num_classes) 그리고 target labels에는 (1- x / num_classes)의 값을 갖도록 한다. 

- axis: 기본 값은 -1이고, etropy가 어떤 차원에 있는지에 따라 계산된다. 

 

10. tf.keras.optimizer.Adam(learning_rate=0.001, beta_1=0.9, beta_2=0.999)

여기에 받는 인자가 많은데 보통 learning_rate만 넣어주는 듯 하다. 

torch에서는 optimizer에 model parameter도 같이 넣었었는데, tensorflow는 학습할 parameter를 tf.Variable()로 미리 선언해주어서 그런지 안넣는듯하다. 

- .apply_gradients(grads_and_vars): (gradient, variables)를 넣어줘서 backpropagation 수행

 

11. .cardinality() in tf.data.Dataset

: dataset의 cardinality를 return (# trainingset으로 보면 될 듯하다.) (*보통 뒤에 .numpy()를 붙여서 사용하는듯)

 

12. .batch(batch_size, drop_remainder, num_parallel_calls, deterministic, name) in tf.data.Dataset

: dataset을 batch 단위로 나눠준다. 

- drop_remainder: dataset의 수가 batch_size로 딱 떨어지지 않을 경우, 남은 나머지를 어떻게 할 것인지? (True: 나머지 배치들 버림, False: 나머지도 사용)

- num_parallel_calls: # batches to compute asynchronously in parallel. 병렬적으로 몇 개의 배치를 돌릴 것인지.. ? (이건 아직 불확실하다.) 만약 num_parallel_calls=tf.data.AUTOTUNE 이면, 자동으로 parallel calls의 수가 지정된다. 

- deterministic: ? 아직 잘 모르겠음

 

13. prefetch(buffer_size, name=None)

: 현재 element가 processing되고 있을 때, 그 뒤의 elements들이 준비될 수 있도록 함. 추가적인 메모리를 사용해서 prefetched elements들을 buffer에 저장해서 latency와 throughput을 향상시켜 줌

 

14. tf.GradientTape(persistent=False, watch_accessed_variables=True)

: automatic 미분을 위한 operations를 기록함. 

- watch_accessed_variables = True --> 자동으로 trainable parameter를 watch

- watch_accessed_variables = False --> 사용자가 명시적으로 gradients를 계산할 변수를 watch해야 함

for epoch in range(num_epochs):
        epoch_total_loss = 0.
        train_accuracy.reset_states()

        for (minibatch_X, minibatch_Y) in minibatches:
            # minibatch_X: (minibatch_size, 12288)
            # minibatch_Y: (minibatch_size, 6 (#classes)) 
            
            with tf.GradientTape() as tape:
                # forward propagation (predict)
                logits = ~
                # compute loss
                minibatch_total_loss = ~

            train_accuracy.update_state(minibatch_Y, tf.transpose(logits))
            
            trainable_variables = [W1, b1, b2, W3, b3]
            grads = tape.gradient(minibatch_total_loss, trainable_variables)
            optimizer.apply_gradients(zip(grads, trainable_variables))
            epoch_total_loss += minibatch_total_loss
        
        epoch_total_loss /= m

보통 이런 식으로 많이 쓰임

 

15. tape.gradient(target, source) in tf.GradientTape()

- target: 미분할 Tensor 또는 Variables 또는 CompositeTensors의 List (loss를 넣어주면 된다.)

- source: target이 sources 내의 elements에 대해서 미분된다. (parameters)