pip install tensorflowjs
tensorflowjs_converter --input_format keras --output_format=tfjs_graph_model model.h5 model_tfjs/
위 커맨드는 model.h5라는 이름으로 저장된 케라스 모델을 Tensorflow.js 레이어로 변환하여 model_tfjs 폴더에 저장합니다.
커맨드 실행 후 model_tfjs 폴더를 살펴보면 model.json 파일과 weight 파일들이 생성된 것을 확인할 수 있습니다.
이 문제를 해결하는 (정확한) 방법은 파이썬 모델을 변환하는 대신 자바스크립트로 똑같은 모델을 작성해준 뒤,
weight만 옮겨서 사용하는 것일텐데요.
저의 경우는 약간의 꼼수를 써서 이걸 해결했습니다.
제 코드에서 문제가 되는 부분은 커스텀 accuracy metric을 사용한 것이었는데,
이 부분은 사실 학습 결과에는 영향을 주지 않는 값이었습니다. Loss만 잘 정의되어 있으면 학습에는 문제가 없으니까요.
1
2
3
4
5
6
7
8
9
10
11
# 문제가 된 함수def_captcha_accuracy(self,captcha_length,classes):defcaptcha_accuracy(y_true,y_pred):sum_acc=0foriinrange(captcha_length):_y_true=tf.slice(y_true,[0,i*classes],[-1,classes])_y_pred=tf.slice(y_pred,[0,i*classes],[-1,classes])sum_acc+=metrics.categorical_accuracy(_y_true,_y_pred)returnsum_acc/captcha_lengthreturncaptcha_accuracy
1
2
3
4
5
6
7
8
9
self.model.compile(optimizer=opt,loss="binary_crossentropy",metrics=[self._captcha_accuracy(captcha_length,char_classes)ifself.save_pathisNoneelse"accuracy"# if model needs to be saved, do not use custom metric for portability],)
그래서 모델을 저장하는 경우에는 일반 accuracy metric을 사용하게끔 바꾸어서 변환이 가능하도록 바꾸었습니다.
tf.loadGraphModel() 함수를 이용해서 모델을 읽어옵니다.
앞서 변환 결과 생성된 model.json 파일의 URL을 인자로 넣어주면 됩니다.
1
2
3
4
5
6
tfGetImage:function(imageId){// Get HTMLImageElement from the document
constimgElem=document.getElementById(imageId);constimg=tf.browser.fromPixels(imgElem);returnthis.tfPreprocessImage(img);},
tf.browser.fromPixels() 함수는 이미지를 모델이 입력으로 받을 수 있는 텐서로 변환합니다.