모든 설명은 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)
'기술 정보' 카테고리의 다른 글
| [Tensorflow] CNN만들기 - Functional API (0) | 2023.10.02 |
|---|---|
| [Tensorflow] CNN만들기 - tf.keras.Sequential() (0) | 2023.10.02 |
| [Colab] Drive mount 하는 법, 경로 설정하는 법 (0) | 2023.09.19 |
| [scikit-learn] feature_extraction.text / CountVectorizer (0) | 2023.09.11 |
| [numpy] np.dot() / np.outer() / np.multiply() 정리 (0) | 2023.09.06 |