Data/ML

TensorFlow.js 소개 및 Python 모델 변환

뚱요 2022. 1. 18. 00:45
반응형

TensorFlow.js

텐서플로우 사용하면서 TensorFlow.js를 접하는 경우가 없었다. 웹캠 관련으로 pose estimator를 사용하는 프로젝트 하면서 배우게 되었다. 이외에도 프론트엔드에서 학습된 모델을  ml5.js 라이브러리와 같이 더 고수준의 API로 간편하게 가져다 쓰거나 직접 학습도 할 수 있다. TFJS에서 홍보하는 프로젝트들을 보면 대부분 가져다 쓰는 경향이 있다.

전이학습으로 학습된 모델을 추론에만 사용하거나 재 학습시키거나 모델을 직접 만들어 훈련시킬 수 있다.

  • JavaScript에서 텐서를 사용하여 계산을 정의하고 실행, ML 모델을 개발하는 프레임워크
  • 브라우저 / Node.js에서 바로 ML을 사용 가능하다.
  • 파이썬 모델 변환 가능
  • 고수준 API를 통한 손쉬운 모델 빌드
  • 특히 컴퓨터 비전에서 많이 사용한다.
  • 사용자는 아무것도 설치할 필요가 없다.
  • 컴퓨팅은 사용자 시스템(모바일이나 컴퓨터)에서 수행되며 모델에 따라서 사용자 기기의 GPU를 사용할 수 있다.

1. tf.Tensor

TensorFlow.js에서 데이터의 중심 단위

하나 이상의 차원 배열로 형성된 값의 집합으로 다차원 배열과 유사하다.

  • rank: 텐서에 포함된 차원 수
  • shape: 데이터의 각 차원의 크기
  • dtype: 텐서의 데이터 유형
    • 기본적으로 float32 데이터 유형이며 bool, int32, complex64 , string  유형 변경 가능
    //1. 생성시부터 디멘션을 정해서 생성한다.
    const a = tf.tensor([[1, 2], [3, 4]]);
    console.log('shape:', a.shape);
    a.print();
    
    // 2. 1차원 배열을 만들고 shape을 정해준다. 
    const shape = [2, 2];
    const b = tf.tensor([1, 2, 3, 4], shape);
    console.log('shape:', b.shape);
    b.print();

 

연산

텐서는 변경이 불가능하기 때문에 이러한 연산은 값을 변경하지 않는다. 대신 연산 반환은 항상 새 tf.Tensor를 반환한다.

참고: 대부분의 연산은 tf.Tensor를 반환하지만 결과는 실제로 아직 준비되지 않았을 수 있다. Tensor.data() or Tensor.array()를 호출하면 이러한 메서드는 계산이 완료된 경우에만 값으로 해결되는 프라미스를 반환한다. UI 컨텍스트(예: 브라우저 앱)에서 실행하는 경우 계산이 완료될 때까지 UI 스레드를 차단하지 않도록 동기식 메서드 대신 이러한 메서드의 '비동기 버전을 항상 선호해야 한다.'

 

 

2. 변환

모델 학습을 텐서플로우 js에서 모델을 만들어 직접 학습시킬 수 도 있고 파이썬에서 학습한 모델을 TensorFlow.js로 변환 이 가능하다. 대부분은 후자가 더 익숙하므로 변환해서 사용하는 법을 다루려 한다. 방법은 크게 2가지로 keras모델을 가져오거나 savedModel로 가져온다. 이렇게 하는 경우 사용자 커스텀한 경우에는 변환이 불가하다.(경험자)

 2.1) Keras 모델

옵션 1. 모델과 가중치를 저장하는 HDF5(. h5) 파일을 TF.js Layer 형식으로 변환

# bash

tensorflowjs_converter --input_format keras \
                       path/to/my_model.h5 \
                       path/to/tfjs_target_dir

옵션 2.Python에서 학습시킨 모델을 tfjs.converters로 바로  TensorFlow.js Layer 형식으로 직접 내보내기

# Python

import tensorflowjs as tfjs

def train(...):
    model = keras.models.Sequential()   # for example
    ...
    model.compile(...)
    model.fit(...)
    tfjs.converters.save_keras_model(model, tfjs_target_dir)
import tensorflowjs as tfjs
#학습시킨 모델을 바로 저장
tfjs.converters.save_keras_model(model, 'my_model.h5')

 

2.2 GraphDef 모델

 기존 TensorFlow 모델을 TensorFlow.js 웹 형식으로 변환하기

pip 패키지에서 제공하는 변환기 스크립트를 실행

 pip install tensorflowjs
 
 tensorflowjs_converter \
    --input_format=tf_saved_model \
    --output_node_names='MobilenetV1/Predictions/Reshape_1' \
    --saved_model_tags=serve \
    /mobilenet/saved_model \
    /mobilenet/web_model

옵션 1. frozen model

tensorflowjs_converter \
    --input_format=tf_frozen_model \
    --output_node_names='MobilenetV1/Predictions/Reshape_1' \
    /mobilenet/frozen_model.pb \
    /mobilenet/web_model

옵션 2. TFhub인 경우

tensorflowjs_converter \
    --input_format=tf_hub \
    'https://tfhub.dev/google/imagenet/mobilenet_v1_100_224/classification/1' \
    /mobilenet/web_model

 

지원되지 않는 연산인 경우 tensorflowjs_converter 스크립트가 실패하고 모델에서 지원되지 않는 연산 목록을 출력

(2) TensorFlow.js Layer 형식의 2가지 결과물

  • model.json(모델 토폴로지, 가중치 매니페스트)
  • group 1-shard\*of\*(바이너리, 샤딩된 가중치 파일 모음)
인수위치   설명
input_path 저장된 모델 디렉터리, 세션 번들 디렉터리, 고정 모델 파일, TensorFlow Hub 모듈 핸들 또는 경로의 전체 경로
output_path 모든 출력 아티팩트의 경로

 

옵션 설명
--input_format 입력 모델의 형식은 저장된 모델에 tf_saved_model, 고정 모델에 tf_frozen_model, 세션 번들에 tf_session_bundle, TensorFlow Hub 모듈에 tf_hub, Keras HDF5에 Keras를 사용
--output_node_names 쉼표로 구분된 출력 노드의 이름
--saved_model_tags 저장된 모델 변환과 로드할 MetaGraphDef의 태그에만 쉼표로 구분된 형식으로 적용, 기본적으로 serve
--signature_name TensorFlow Hub 모듈 변환과 로드할 서명에만 적용, 기본값은 default. https://www.tensorflow.org/hub/common_signatures/를 참조하세요.

 

 

변환은 시작일뿐이었다. 메모리 관리도 해줘야 한다. 자료가 너무 없어서 TFJS  공식문서랑 github에서 대부분 참고하면서 진행했었다.

 

출처:

https://www.tensorflow.org/js?hl=ko 

 

TensorFlow.js | 자바스크립트 개발자를 위한 머신러닝

브라우저, Node.js 또는 Google Cloud Platform에서 모델을 학습시키고 배포합니다. TensorFlow.js는 자바스크립트 및 웹 개발을 위한 오픈소스 ML 플랫폼입니다.

www.tensorflow.org

https://github.com/tensorflow/tfjs

 

GitHub - tensorflow/tfjs: A WebGL accelerated JavaScript library for training and deploying ML models.

A WebGL accelerated JavaScript library for training and deploying ML models. - GitHub - tensorflow/tfjs: A WebGL accelerated JavaScript library for training and deploying ML models.

github.com

https://github.com/tensorflow/tfjs-converter/blob/master/tfjs-converter/README.md

 

GitHub - tensorflow/tfjs-converter: Convert TensorFlow SavedModel and Keras models to TensorFlow.js

Convert TensorFlow SavedModel and Keras models to TensorFlow.js - GitHub - tensorflow/tfjs-converter: Convert TensorFlow SavedModel and Keras models to TensorFlow.js

github.com

반응형