이 페이지는 Cloud Translation API를 통해 번역되었습니다.
Switch to English

TF1 허브 형식

2018 년에 출시 된 TensorFlow Hub는 단일 유형의 자산 인 TensorFlow 1 프로그램으로 가져 오기위한 TF1 Hub 형식을 제공했습니다.

이 페이지에서는 hub.Module 클래스 및 관련 API와 함께 TF1 (또는 TF2의 TF1 호환성 모드)에서 TF1 Hub 형식을 사용하는 방법에 대해 설명합니다. (일반적인 용도는 tf.Graph Hub 형식의 하나 이상의 모델을 tf.compat.layers 또는 tf.layers 와 결합하여 TF1 Estimator 내에 tf.Graph 를 빌드하는 것입니다).

TensorFlow 2 (TF1 호환 모드 외부) 사용자는 hub.load() 또는 hub.KerasLayer 와 함께 새 API를 사용해야 합니다 . 새 API는 새 TF2 SavedModel 자산 유형 을로드 하지만 TF1 Hub 형식을 TF2로로드하는 데 대한 지원 도 제한 되어 있습니다.

TF1 Hub 형식의 모델 사용

TF1 Hub 형식으로 모델 인스턴스화

URL 또는 파일 시스템 경로가있는 문자열에서 hub.Module 오브젝트를 작성하여 TF1 Hub 형식의 모델을 TensorFlow 프로그램으로 가져옵니다.

 m = hub.Module("path/to/a/module_dir")
 

모듈 변수를 현재 TensorFlow 그래프에 추가합니다. 초기화 프로그램을 실행하면 디스크에서 사전 훈련 된 값을 읽습니다. 마찬가지로 테이블 및 기타 상태가 그래프에 추가됩니다.

캐싱 모듈

URL에서 모듈을 작성할 때 모듈 컨텐츠는 로컬 시스템 임시 디렉토리에 다운로드되어 캐시됩니다. TFHUB_CACHE_DIR 환경 변수를 사용하여 모듈이 캐시되는 위치를 대체 할 수 있습니다. 자세한 내용은 캐싱을 참조하십시오.

모듈 적용

인스턴스화되면 텐서 입력에서 텐서 출력에 이르는 파이썬 함수와 같이 모듈 m 을 0 번 이상 호출 할 수 있습니다.

 y = m(x)
 

이러한 각 호출은 현재 TensorFlow 그래프에 연산을 추가하여 x 에서 y 를 계산합니다. 여기에 훈련 된 가중치가있는 변수가 관련된 경우 모든 애플리케이션간에 공유됩니다.

모듈은 여러 방법으로 적용될 수 있도록 여러 개의 명명 된 서명 을 정의 할 수 있습니다 (Python 객체에 메소드 가있는 방법 과 유사). 모듈 문서는 사용 가능한 서명을 설명해야합니다. 위의 호출은 "default" 라는 서명을 적용합니다. 이름을 선택적 signature= 인수에 전달하여 모든 서명을 선택할 수 있습니다.

서명에 여러 입력이있는 경우 서명에 의해 정의 된 키와 함께 dict로 전달되어야합니다. 마찬가지로, 서명에 여러 개의 출력이있는 경우 서명에 의해 정의 된 키 아래에 as_dict=True 를 전달하여 dict로 검색 할 수 있습니다 ( "default" 키는 as_dict=False 경우 반환되는 단일 출력에 대한 as_dict=False ). 모듈을 적용하는 가장 일반적인 형태는 다음과 같습니다.

 outputs = m(dict(apples=x1, oranges=x2), signature="fruit_to_pet", as_dict=True)
y1 = outputs["cats"]
y2 = outputs["dogs"]
 

호출자는 서명으로 정의 된 모든 입력을 제공해야하지만 모든 모듈의 출력을 사용할 필요는 없습니다. TensorFlow는 tf.Session.run() 에서 대상의 종속성으로 끝나는 모듈 부분 만 실행합니다. 실제로 모듈 게시자는 기본 출력과 함께 고급 사용 (중간 레이어 활성화 등)을위한 다양한 출력을 제공하도록 선택할 수 있습니다. 모듈 소비자는 추가 출력을 정상적으로 처리해야합니다.

대체 모듈 시도

동일한 작업에 대해 여러 개의 모듈이있을 때마다 TensorFlow Hub는 호환되는 신호 (인터페이스)를 장착하여 서로 다른 모듈을 시도하는 것이 문자열 값 하이퍼 파라미터처럼 모듈 핸들을 변경하는 것만 큼 쉽습니다.

이를 위해 인기있는 작업에 권장되는 공통 서명 모음을 유지 관리합니다.

새 모듈 만들기

호환성 메모

TF1 Hub 형식은 TensorFlow 1에 맞춰져 있습니다. TensorFlow 2의 TF Hub에서만 부분적으로 지원됩니다. 대신 새 TF2 SavedModel 형식으로 게시하십시오.

TF1 Hub 형식은 구문 수준 (동일한 파일 이름 및 프로토콜 메시지)에서 TensorFlow 1의 SavedModel 형식과 유사하지만 모듈 재사용, 구성 및 재 훈련 (예 : 다른 리소스 이니셜 라이저 저장소, 다른 태그 지정)을 허용하기 위해 의미 적으로 다릅니다. 논문에 대한 협약). 디스크에서 구별하는 가장 쉬운 방법은 tfhub_module.pb 파일의 존재 여부입니다.

일반적인 접근

새 모듈을 정의하려면, 게시자는 호출 hub.create_module_spec() 함수와 module_fn . 이 함수는 호출자가 제공 할 입력에 tf.placeholder() 를 사용하여 모듈의 내부 구조를 나타내는 그래프를 구성합니다. 그런 다음 hub.add_signature(name, inputs, outputs) 한 번 이상 호출하여 서명을 정의합니다.

예를 들면 다음과 같습니다.

 def module_fn():
  inputs = tf.placeholder(dtype=tf.float32, shape=[None, 50])
  layer1 = tf.layers.dense(inputs, 200)
  layer2 = tf.layers.dense(layer1, 100)
  outputs = dict(default=layer2, hidden_activations=layer1)
  # Add default signature.
  hub.add_signature(inputs=inputs, outputs=outputs)

...
spec = hub.create_module_spec(module_fn)
 

경로 대신 hub.create_module_spec() 의 결과를 사용하여 특정 TensorFlow 그래프 내에서 모듈 객체를 인스턴스화 할 수 있습니다. 이 경우 검사 점이 없으며 모듈 인스턴스는 대신 변수 이니셜 라이저를 사용합니다.

export(path, session) 메소드를 통해 모든 모듈 인스턴스를 디스크에 직렬화 할 수 있습니다. 모듈을 내 보내면 session 에있는 변수의 현재 상태와 함께 정의를 전달 된 경로로 직렬화합니다. 미세 조정 된 모듈을 내보낼 때뿐만 아니라 처음으로 모듈을 내보낼 때 사용할 수 있습니다.

TensorFlow Estimators와의 호환성을 위해 hub.LatestModuleExportertf.estimator.LatestExporter 와 마찬가지로 최신 검사 점에서 모듈을 내 보냅니다 hub.LatestModuleExporter 는 최신 검사 점에서 전체 모델을 내 보냅니다.

모듈 게시자는 가능한 경우 공통 서명을 구현하여 소비자가 모듈을 쉽게 교환하고 문제에 가장 적합한 모듈을 찾을 수 있도록해야합니다.

실제 예

일반적인 텍스트 포함 형식에서 모듈을 만드는 방법에 대한 실제 예는 텍스트 포함 모듈 내보내기 를 살펴보십시오.

미세 조정

가져온 모듈의 변수를 주변의 모델 변수와 함께 훈련하는 것을 미세 조정 이라고 합니다 . 미세 조정은 품질을 향상시킬 수 있지만 새로운 합병증을 추가합니다. 소비자는 더 간단한 품질 조정을 탐색 한 후에 만 ​​모듈 게시자가 권장하는 경우에만 미세 조정을 검토하는 것이 좋습니다.

소비자를 위해

미세 조정을 가능하게하려면 hub.Module(..., trainable=True) 로 모듈을 인스턴스화하여 변수를 학습 가능하게하고 TensorFlow의 REGULARIZATION_LOSSES 가져 REGULARIZATION_LOSSES . 모듈에 여러 개의 그래프 변형이있는 경우 훈련에 적합한 것을 선택하십시오. 일반적으로 이는 {"train"} 태그가있는 것입니다.

사전 훈련 된 가중치를 망치지 않는 훈련 체제를 선택하십시오 (예 : 처음부터 훈련하는 것보다 낮은 학습률).

출판사

소비자의 미세 조정을보다 쉽게하려면 다음 사항에 유의하십시오.

  • 미세 조정에는 정규화가 필요합니다. 모듈은 REGULARIZATION_LOSSES 컬렉션으로 내보내 REGULARIZATION_LOSSES , tf.layers.dense(..., kernel_regularizer=...) 등을 소비자가 tf.losses.get_regularization_losses() 에서 선택하는 tf.losses.get_regularization_losses() 가져옵니다. L1 / L2 정규화 손실을 정의하는이 방법을 선호하십시오.

  • 게시자 모델에서 tf.train.FtrlOptimizer , tf.train.ProximalGradientDescentOptimizer 및 기타 근위 옵티마이 tf.train.ProximalGradientDescentOptimizer l1_l2_regularization_strength 매개 변수를 통해 L1 / L2 정규화를 정의하지 마십시오. 이것들은 모듈과 함께 내보내지지 않으며 전 세계적으로 정규화 강도를 설정하는 것이 소비자에게 적합하지 않을 수 있습니다. 넓은 (즉, 희박한 선형) 또는 넓은 & 깊은 모델에서 L1 정규화를 제외하고 개별 정규화 손실을 대신 사용할 수 있어야합니다.

  • 드롭 아웃, 배치 정규화 또는 이와 유사한 교육 기술을 사용하는 경우 하이퍼 파라미터를 여러 예상 용도에 적합한 값으로 설정하십시오. 탈락률은 대상 문제의 과적 합 성향에 맞게 조정되어야합니다. 배치 정규화에서 운동량 (일명 붕괴 계수)은 작은 데이터 세트 및 / 또는 큰 배치로 미세 조정을 수행 할 수있을 정도로 작아야합니다. 고급 소비자의 경우 크리티컬 하이퍼 파라미터를 제어하는 ​​서명을 추가하는 것이 좋습니다.