1. 텐서플로를 한마디로 어떻게 정의할 수 있나요? 텐서플로의 주요 특징은 무엇인가요? 인기 있는 딥러닝 라이브러리는 어떤 것이 있나요?

텐서플로는 수치 계산, 특히 대규모 머신러닝에 잘 맞도록 튜닝된 오픈 소스 라이브러리이다.
핵심은 numpy와 비슷하지만 GPU를 지원한다. 또한 분산컴퓨팅, 계산 그래프 분석과 최적화 기능을 제공.
후진 모드 자동미분 기반의 최적화 API와 tf.keras, tf.data, tf.image, tf.signal 등과 같은 강력한 API를 제공.
다른 딥러닝 라이브러리는 파이토치, MXNet, 마이크로소프트 코그니티브 툴킷, 시애노, 카페2(Caffe2), 체이너가 있다.

2. 텐서플로는 넘파이를 그대로 대체할 수 있나요? 두 라이브러리의 주요 차이점은 무엇인가요?

텐서플로우가 넘파이 기능 대부분을 제공하지만 다음과 같은 이유로 대체제가 되지는 못한다.

  1. 모든 함수의 이름이 같지 않다.
    ex) tf.reduce_sum() <-> np.sum()
  2. 일부 함수는 작동 방식이 완전히 같진 않다.
    ex) tf.transpose() 는 텐서의 전치 복사본을 만들지만 numpy 의 T 메서드는 그냥 전치된 뷰를 만드는것이다.
  3. numpy 배열은 변경 가능하지만, 텐서플로의 텐서는 만든 후 변경이 불가능하다.
    (but tf.Variable 사용가능)

3. tf.ragne(10) 와 tf.constant(np.arnage(10))의 결과는 같나요?

다음과 같이 출력된다.
tf.Tensor([0 1 2 3 4 5 6 7 8 9], shape=(10,), dtype=int32)
tf.Tensor([0 1 2 3 4 5 6 7 8 9], shape=(10,), dtype=int64)

4. 일반 텐서 외에 텐서플로에서 사용할 수 있는 6가지 다른 데이터 구조는 무엇인가요?

  • 희소텐서.
  • 텐서 배열.
  • 래그드 텐서.
  • 큐.
  • 문자열 텐서.
  • 집합.
  • 문자열 텐서와, 집합은 일반 텐서로 표현되지만 이를 조작하기 위한 특별한 함수 (tf.strings와 tf.sets 안에) 제공한다.

5. keras.losses.Loss 클래스를 상속하거나 일반 함수를 작성하여 사용자 정의 손실 함수를 정의할 수 있습니다. 언제 사용해야 하나요?

사용자 정의 손실 함수를 정의하려면 일반적으로 일반 파이썬 함수로 정의하여야 한다.
하지만 사용자 정의 손실 함수가 일부 매개변수를 지원해야 한다면 keras.losses.Loss 클래스를 상속하고 init()와 call() 메서드를 구현해야 합니다.
손실 합수의 매개변수를 모델과 함께 저장하려면 get_config() 메서드도 구현해야 합니다.

6. keras.metric.Metric 클래스를 상속하거나 일반 함수를 정의하여 지표를 정의할 수 있습니다. 언제 사용해야 하나요?

사용자 손실 함수와 매우 비슷하게 대부분의 지표는 파이썬 함수로 정의할 수 있습니다. 하지만 사용자 정의 지표가 일부 매개변수를 지원해야 한다면 keras.metrics.Metric 클래스를 상속해야 한다.
또한 에포크 전체에 대해 이 지표를 계산하는 것과 에포크 안의 모든 배치에 대해 평균 지표를 계산하는 것이 동일하지 않으면( 예를 들어 정밀도와 재현율) keras.metrics.Metric 클래스를 상속하고 init(), update_state(), result() 메서드를 구현하여 에포크 동안에 변화하는 지푯값을 기록해야 합니다.
또한 변수를 0.0으로 초기화 하는 것이 필요하지 않다면 reset_states() 매서드도 구현해야 합니다. 모델과 함께 상태를 저장하려면 get_config() 메서드도 구현해야 합니다.

7. 언제 사용자 정의 층 또는 사용자 정의 모델을 만들어야 하나요?

모델의 내부 구성 요소(층 또는 재사용 가능한 층의 블럭)와 모델 자체(즉 훈련할 대상)로 구분합니다.
전자는 keras.layers.Layer 클래스를 상속하고 후자는 keras.models.Model 클래스를 상속해야 합니다.

8. 사용자 정의 훈련 반복을 만들어야 하는 경우는 어떤 것이 있나요?

매우 고급 기능이기 때문에 정말 필요할 때만 사용해야 한다.
이것을 사용하면 오류가 발생하기 쉽고, 작성한 코드를 재사용 하기도 힘들기 때문에 필수적일 때를 제외하고는 사용하지 않는 것을 추천한다.

9. 케라스 사용자 정의 구성 요소가 임의의 파이썬 코드를 담을 수 있나요? 또는 이 구성요소를 텐서플로 함수로 바꿀 수 있나요?

499 page 참고
케라스 사용자 정의 구성 요소는 텐서플로 함수로 바꿀 수 있어야 한다.
dynamic=True 또는 모델의 compile() 메서드를 호출 할 때 run_eagerly=True를 지정한다.

10. 텐서플로 함수로 바꿀 수 있는 함수를 만든다면 따라야 할 주요 규칙은 무엇일까요?

499 page 참고.

11. 동적인 케라스 모델을 만들어야 할 때는 언제인가요? 어떻게 만들 수 있나요? 왜 전체 모델을 동적으로 만들지 않나요?

동적인 케라스 모델을 만들면 디버깅에 융용하다. 사용자 정의 구성 요소를 텐서플로 함수로 컴파일 하지 않기 때문에 코드 디버깅을 위해 어떤 파이썬 디버거를 사용할 수 있다. 외부 라이브러리를 호출하는 것을 포함해 모델에 임의의 파이썬 코드를 넣고 싶을때도 사용한다.
dynamic=True 또는 모델의 compile() 메서드를 호출 할 때 run_eagerly=True를 지정한다.
모델을 동적으로 만들면 텐서플로의 그래프 장점을 활용하지 못한다. 따라서 훈련과 추론 속도가 느려지고 계산 그래프로 내보낼 수 없어 모델의 이식성에 제약이 생긴다.

12, 13 실습

Click 구글 코랩

Comments