날짜를 저장하십시오! Google I / O가 5 월 18 일부터 20 일까지 반환됩니다. 지금 등록
이 페이지는 Cloud Translation API를 통해 번역되었습니다.
Switch to English

재사용 가능한 저장된 모델

소개

TensorFlow Hub는 다른 자산 중에서도 TensorFlow 2 용 저장된 모델을 호스팅합니다. obj = hub.load(url) [ 자세히 알아보기 ]를 사용하여 Python 프로그램에 다시로드 할 수 있습니다. 반환 된 objtf.saved_model.load() 의 결과입니다 (TensorFlow의 저장된 모델 가이드 참조). 이 객체는 tf.functions, tf.Variables (사전 학습 된 값에서 초기화 됨), 기타 리소스 및 재귀 적으로 더 많은 객체 인 임의의 속성을 가질 수 있습니다.

이 페이지는 TensorFlow Python 프로그램에서 재사용 하기 위해로드 된 obj 에 의해 구현되는 인터페이스를 설명합니다. 이 인터페이스를 준수하는 저장된 모델을 재사용 가능한 저장된 모델 이라고합니다.

재사용은 미세 조정 기능을 포함하여 obj 주위에 더 큰 모델을 구축하는 것을 의미합니다. 미세 조정은 주변 모델의 일부로로드 된 obj 의 가중치를 추가로 훈련하는 것을 의미합니다. 손실 함수와 옵티마이 저는 주변 모델에 의해 결정됩니다. obj 는 출력 활성화에 대한 입력 매핑 ( "포워드 패스") 만 정의하며 드롭 아웃 또는 배치 정규화와 같은 기술을 포함 할 수 있습니다.

TensorFlow Hub 팀 은 위의 의미에서 재사용 될 예정인 모든 저장된 모델에서 재사용 가능한 저장된 모델 인터페이스구현할 것을 권장합니다 . tensorflow_hub 라이브러리의 많은 유틸리티, 특히 hub.KerasLayer 는이를 구현하기 위해 SavedModels가 필요합니다.

SignatureDefs와의 관계

tf.functions 및 기타 TF2 기능 측면에서이 인터페이스는 TF1 이후로 사용 가능했으며 추론을 위해 TF2에서 계속 사용되는 저장된 모델의 서명과 별개입니다 (예 : TF Serving 또는 TF Lite에 저장된 모델 배포). 추론을위한 서명은 미세 조정을 지원할만큼 충분히 표현 tf.function 은 재사용 된 모델에 대해보다 자연스럽고 표현력이 풍부한 Python API 를 제공합니다.

모델 구축 라이브러리와의 관계

재사용 가능한 저장된 모델은 Keras 또는 Sonnet과 같은 특정 모델 구축 라이브러리와 관계없이 TensorFlow 2 프리미티브 만 사용합니다. 이를 통해 원래 모델 빌드 코드에 대한 종속성이없는 모델 빌드 라이브러리에서 재사용이 용이합니다.

재사용 가능한 저장된 모델을 주어진 모델 구축 라이브러리에로드하거나 저장하려면 어느 정도 조정이 필요합니다. Keras의 경우 hub.KerasLayer 가 로딩을 제공하고, Keras 의 SavedModel 형식으로 내장 된 저장이이 인터페이스의 상위 집합을 제공하기 위해 TF2 용으로 재 설계되었습니다 (2019 년 5 월의 RFC 참조).

작업 별 "공통 저장된 모델 API"와의 관계

이 페이지의 인터페이스 정의는 입력 및 출력의 수와 유형을 허용합니다. TF Hub 용 Common SavedModel API는 모델을 쉽게 교환 할 수 있도록 특정 작업에 대한 사용 규칙으로이 일반 인터페이스를 구체화합니다.

인터페이스 정의

속성

재사용 가능한 저장된 모델은 obj = tf.saved_model.load(...) 가 다음 속성을 가진 객체를 반환하는 TensorFlow 2 저장된 모델입니다.

  • __call__ . 필수입니다. 아래 사양에 따라 모델의 계산 ( "포워드 패스")을 구현하는 tf.function.

  • variables : tf.Variable 객체의 목록으로, 훈련 가능 및 훈련 불가능을 포함하여 가능한 모든 __call__ 호출에 사용되는 모든 변수를 나열합니다.

    이 목록은 비어있는 경우 생략 할 수 있습니다.

  • trainable_variables : v.trainable 이 모든 요소에 대해 true가되는 v.trainable 객체의 목록입니다. 이 변수의 하위 집합이어야합니다 variables . 개체를 미세 조정할 때 학습 할 변수입니다. 저장된 모델 생성자는 미세 조정 중에 수정해서는 안된다는 것을 나타 내기 위해 원래 학습 가능한 일부 변수를 여기에서 생략 할 수 있습니다.

    이 목록은 비어있는 경우, 특히 저장된 모델이 미세 조정을 지원하지 않는 경우 생략 할 수 있습니다.

  • regularization_losses : 각각 0 개의 입력을 받고 단일 스칼라 부동 텐서를 반환하는 tf.functions 목록입니다. 미세 조정을 위해 SavedModel 사용자는이를 추가 정규화 용어로 손실에 포함하는 것이 좋습니다 (가장 간단한 경우 추가 확장없이). 일반적으로 가중치 정규화를 나타내는 데 사용됩니다. (입력 부족으로 인해 이러한 tf.functions는 활동 정규화를 표현할 수 없습니다.)

    이 목록은 비어있는 경우 생략 할 수 있습니다. 특히 저장된 모델이 미세 조정을 지원하지 않거나 가중치 정규화를 지정하지 않으려는 경우에는 생략 할 수 있습니다.

__call__ 함수

복원 된 저장된 모델 obj 에는 복원 된 tf.function 인 obj.__call__ 속성이 있으며 다음과 같이 obj 를 호출 할 수 있습니다.

시놉시스 (의사 코드) :

outputs = obj(inputs, trainable=..., **kwargs)

인수

인수는 다음과 같습니다.

  • SavedModel의 입력 활성화 배치와 함께 하나의 위치 필수 인수가 있습니다. 그 유형은 다음 중 하나입니다.

    • 단일 입력을위한 단일 Tensor,
    • 명명되지 않은 입력의 순서가 지정된 시퀀스에 대한 Tensor 목록,
    • 특정 입력 이름 세트로 키가 지정된 텐서 사전.

    (이 인터페이스의 향후 개정에서는보다 일반적인 중첩이 허용 될 수 있습니다.) 저장된 모델 생성자는 그중 하나와 텐서 모양 및 dtype을 선택합니다. 유용한 경우 모양의 일부 치수는 정의되지 않아야합니다 (특히 배치 크기).

  • Python 부울, True 또는 False 를 허용하는 선택적 키워드 인수 training 이있을 수 있습니다. 기본값은 False 입니다. 모델이 미세 조정을 지원하고 그 계산이 둘 사이에서 다른 경우 (예 : 드롭 아웃 및 배치 정규화에서와 같이)이 인수로 구분이 구현됩니다. 그렇지 않으면이 인수가 없을 수 있습니다.

    __call__ 이 Tensor 값 training 인수를 수락 할 필요는 없습니다. 그들 사이를 디스패치하기 위해 필요한 경우 tf.cond() 를 사용하는 것은 호출자에게 있습니다.

  • SavedModel 작성자 이상의 선택적 수용하도록 선택할 수 있습니다 kwargs 특정 이름을.

    • Tensor 값 인수의 경우 SavedModel 생성자는 허용 가능한 dtype 및 모양을 정의합니다. tf.function 은 tf.TensorSpec 입력으로 추적되는 인수에서 Python 기본값을 허용합니다. 이러한 인수를 사용하여 __call__ 관련된 숫자 하이퍼 파라미터를 사용자 정의 할 수 있습니다 (예 : 드롭 아웃 비율).

    • Python 값 인수의 경우 저장된 모델 생성자가 허용 가능한 값을 정의합니다. 이러한 인수는 추적 된 함수에서 개별적인 선택을하기위한 플래그로 사용될 수 있습니다 (그러나 추적의 조합 폭발에 유의하십시오).

복원 된 __call__ 함수는 허용되는 모든 인수 조합에 대한 추적을 제공해야합니다. TrueFalse 사이에서 training 을 뒤집는 것이 주장의 허용 성을 변경해서는 안됩니다.

결과

obj 호출의 outputs 은 다음과 같습니다.

  • 단일 출력을위한 단일 Tensor,
  • 명명되지 않은 출력의 순서가 지정된 시퀀스에 대한 Tensor 목록,
  • 특정 출력 이름 세트로 키가 지정된 Tensor 사전.

(이 인터페이스의 향후 개정에서는보다 일반적인 중첩이 허용 될 수 있습니다.) 반환 유형은 Python 값 kwarg에 따라 달라질 수 있습니다. 이것은 추가 출력을 생성하는 플래그를 허용합니다. SavedModel 생성자는 출력 dtype 및 모양과 입력에 대한 종속성을 정의합니다.

명명 된 콜 러블

재사용 가능한 저장된 모델은 이름이 지정된 하위 객체 (예 : obj.foo , obj.bar 등)에 넣어 위에서 설명한 방식으로 여러 모델 조각을 제공 할 수 있습니다. 각 하위 객체는 __call__ 메서드와 해당 모델 조각에 특정한 변수 등에 대한 속성을 지원합니다. 위의 예에서는 obj.foo.__call__ , obj.foo.variables 등이 있습니다.

이 인터페이스로 직접 베어 tf.function를 추가하는 방법 적용되지 않습니다 tf.foo .

재사용 가능한 저장된 모델 사용자는 한 수준의 중첩 ( obj.bar , obj.bar.baz ) 만 처리 obj.bar.baz 합니다. (이 인터페이스의 향후 개정에서는 더 깊은 중첩을 허용 할 수 있으며 최상위 수준 개체를 자체적으로 호출 할 수 있어야한다는 요구 사항을 면제 할 수 있습니다.)

맺음말

In-process API와의 관계

이 문서는 tf.saved_model.save()tf.saved_model.load() 를 통한 직렬화를 통해 왕복을 유지하는 tf.function 및 tf.Variable과 같은 기본 요소로 구성된 Python 클래스의 인터페이스를 설명합니다. 그러나 인터페이스는 tf.saved_model.save() 에 전달 된 원래 객체에 이미 존재했습니다. 해당 인터페이스에 맞게 조정하면 단일 TensorFlow 프로그램 내에서 모델 구축 API간에 모델 조각을 교환 할 수 있습니다.