12장 연습문제
https://colab.research.google.com/drive/1NX51vP_zIzZVSQS_gBdAdoxSuNcwfhbA#scrollTo=umwcCwIi2_uk
3. tf.range(10), tf.constant(np.arange(10)) 의 차이점
전자는 int32, 후자는 int64의 텐서를 반환함
4. 일반 텐서외 텐서플로에서 사용가능한 6가지 다른 데이터 타입들
희소텐서, 텐서 배열, 래그드 텐서, 큐, 문자열 텐서, 집합 등...
5. keras.losses.Loss 을 상속받거나 함수를 작성해서 사용자 정의 손실을 작성하는 이유?
일반적인 파이썬함수로 구현가능하지만, 일부 매개변수를 지원해야 한다면 클래스를 상속받고 __init__, call 메서드를 구현한다.
추가적인 매개변수는 get_config() 모델과 함께 저장가능하다.
6. keras.metrics.Metric 을 상속받거나 함수를 작성해서 지표를 정의 하는 이유?
파이썬함수로도 지표를 정의가능하지만, 일부 매개변수를 지원해야하거나, 에포크 전체에 대한 지표를 계산하기 위해서 클래스를 상속받아서 사용한다. __init__, update_state, result 메서드를 구현한다.
7. 사용자 정의 층 및 사용자 정의 모델을 작성하는 이유?
층에 원하는 기능을 추가하거나, 자유로운 모델을 원할 때 사용한다. keras.layers.Layer, keras.models.Model 을 상속받아 구현한다.
8. 사용자 정의 훈련반복을 만들어야 하는 이유?
사용자 정의 훈련반복 정의없이 훈련을 커스터마이징할 수 있는 콜백, 사용자 정의 규제, 사용자 정의 제한, 사용자 정의 손실 등을 제공하기 때문에 가능하다면 사용자 정의 훈련반복은 피하고 이들을 사용하는것이 좋다. 하지만 일부 경우에는 필수적으로 사용되어야 한다. 예를들어 두개의 옵티마이저를 사용하는 경우..
9. 케라스 사용자 정의 구성요소가 파이썬 코드를 담을 수 있나? 또는 이 구성요소를 텐서플로 함수로 변환 가능한가?
케라스 사용자 정의 구성요소는 텐서플로 함수로 바뀌어 텐서플로 연산으로만 사용되는게 좋다. 임의의 파이썬 코드를 만들고싶으면 tf.py_function()으로 감싸거나, dynamic=True, run_eagerly=True 를 지정하는 방법을 이용한다.
11. 동적인 케라스 모델을 만들어야하는 이유? 어떻게? 왜 전체 모델을 동적으로 만들지 않을까?
동적인 케라스 모델은 텐서플로 함수로 컴파일하지 않기 때문에, 어떤 파이썬 디버거든 사용가능하다. 외부 라이브러리 호출, 임의의 파이썬 코드 등 원래 제약사항이었던 것들이 가능하게 된다. 대신 모델을 생성할 때 즉시 실행 모드로 생성해야하고, 텐서플로의 계산그래프의 이점을 사용하지 못한다.
12. 층 정규화layer normalization 을 수행하는 사용자 정의층을 구현하기.
https://colab.research.google.com/drive/1NX51vP_zIzZVSQS_gBdAdoxSuNcwfhbA#scrollTo=12_12
(a) build 메서드에 두개의 훈련 가능한 가중치를 정의하기
(b) call() 메서드에서 샘플의 특성마다 평균과 표준편차를 계산하기.
(c) 사용자 정의 층이 LayerNormalization과 동일한 출력을 만드는지 확인하기.
13. 사용자 정의 훈련 반복을 통해 fasion-mnist 데이터셋으로 모델 훈련하기.
https://colab.research.google.com/drive/1NX51vP_zIzZVSQS_gBdAdoxSuNcwfhbA#scrollTo=12_13
(a) 에폭, 반복, 평균 훈련 손실, 에폭 평균 정확도, 검증 손실 정확도 출력
(b) 상위층과 하위층에 다른 옵티마이저 사용하기