เนื่องจากใน Web Browser มีทรัพยากรจำกัด การที่เราจะใช้ TensorFlow.js เทรนโมเดลตั้งแต่ต้น จะทำให้เสียเวลาค่อนข้างมาก

ในการใช้งาน TensorFlow.js ส่วนใหญ่ เราจึงจะต้องการเทรนโมเดล ด้วยภาษา Python บน Cloud หรือ เครื่อง Server ขนาดใหญ่ ที่มี GPU ความเร็วสูง เมื่อเรียบร้อยแล้ว แล้วนำโมเดลนั้นมาแปลง Convert เพื่อไป Load ใช้งานบน Web Browser รัน JavaScript อีกทีหนึ่ง

TensorFlow.js converter คืออะไร

To be able to run models on a variety of runtimes, including the cloud, web, browser, Node.js, mobile and embedded systems, we have standardized on the SavedModel file format. Credit https://blog.tensorflow.org/2019/09/tensorflow-20-is-now-available.html
To be able to run models on a variety of runtimes, including the cloud, web, browser, Node.js, mobile and embedded systems, we have standardized on the SavedModel file format. Credit https://blog.tensorflow.org/2019/09/tensorflow-20-is-now-available.html

TensorFlow.js converter คือ Library ที่ใช้ในการแปลงและโหลด Pre-trained โมเดลของ TensorFlow ทั้งจาก TensorFlow Hub และ SavedModel ให้ทำงานใน Web Browser ผ่าน TensorFlow.js

กระบวนการมี 2 ขั้นตอน ดังนี้

  1. แปลงโมเดลของเราเอง หรือแปลงโมเดลสำเร็จรูปที่คนอื่นทำไว้ให้แล้ว เช่น MobileNet ให้เป็นไฟล์รูปแบบที่เหมาะกับการใช้งานบนเว็บ
  2. ใช้ JavaScript API โหลดไฟล์โมเดลขึ้นมา และเรียกใช้งาน Inference

ขั้นแรก : Convert โมเดลให้เป็น JSON

TensorFlow.js converter รองรับโมเดลหลาย Format เช่น TensorFlow SavedModel, TensorFlow Hub module, Keras HDF5 และ tf.keras SavedModel

ตัวอย่างการแปลง TensorFlow SavedModel 

tensorflowjs_converter \
    --input_format=tf_saved_model \
    --output_format=tfjs_graph_model \
    --signature_name=serving_default \
    --saved_model_tags=serve \
    /mobilenet/saved_model \
    /mobilenet/web_model

ตัวอย่างการแปลง TensorFlow Frozen Model 

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

ตัวอย่างการแปลง Tensorflow Hub module 

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

ตัวอย่างการแปลง Keras HDF5 model 

tensorflowjs_converter \
    --input_format=keras \
    /tmp/my_keras_model.h5 \
    /tmp/my_tfjs_model

ตัวอย่างการแปลง tf.keras SavedModel 

tensorflowjs_converter \
    --input_format=keras_saved_model \
    /tmp/my_tf_keras_saved_model/1542211770 \
    /tmp/my_tfjs_model

เรามาเริ่มกันเลยดีกว่า

Open In Colab

0. Install

Install TensorFlow.js ด้วย pip

In [0]:
# !pip install tensorflowjs

1. Import

Import Library ที่เราจะใช้

In [3]:
import numpy as np
import tensorflow as tf

print('\u2022 Using TensorFlow Version:', tf.__version__)

The default version of TensorFlow in Colab will soon switch to TensorFlow 2.x.
We recommend you upgrade now or ensure your notebook will continue to use TensorFlow 1.x via the %tensorflow_version 1.x magic: more info.

• Using TensorFlow Version: 1.15.0

2. Dataset

ชุดข้อมูลตัวอย่าง y = 5x + 0 + Noise ที่เราจะใช้ Feed ให้โมเดล ทำ Linear Regression

In [0]:
xs = np.array([-2.0, -1.0,  0.0, 1.0, 2.0,  3.0,  4.0,  5.0,  6.1], dtype=float)
ys = np.array([-9.8, -5.1, -0.3, 5.3, 9.9, 15.3, 19.7, 24.8, 30.4], dtype=float)

3. Model

สร้างโมเดล Sequential ประกอบด้วย 1 Dense Layer ไม่มี Activation Function ใช้สำหรับทำ Linear Regression แบบง่าย

In [0]:
model = tf.keras.models.Sequential([
        tf.keras.layers.Dense(units=1, input_shape=[1])  
])

4. Compile Model

Compile โมเดล ด้วย Adam Optimizer ใช้ Mean Squared Error Loss Function

In [0]:
model.compile(optimizer=tf.keras.optimizers.Adam(lr=1., beta_1=0.), loss='mean_squared_error')

5. Training

เทรนไป 20 Epoch

In [18]:
model.fit(xs, ys, epochs=20)
Train on 9 samples
Epoch 1/20
9/9 [==============================] - 0s 8ms/sample - loss: 328.4389
Epoch 2/20
9/9 [==============================] - 0s 273us/sample - loss: 202.9467
Epoch 3/20
9/9 [==============================] - 0s 229us/sample - loss: 119.6928
Epoch 4/20
9/9 [==============================] - 0s 234us/sample - loss: 68.2303
Epoch 5/20
9/9 [==============================] - 0s 223us/sample - loss: 38.6908
Epoch 6/20
9/9 [==============================] - 0s 217us/sample - loss: 22.8236
Epoch 7/20
9/9 [==============================] - 0s 300us/sample - loss: 14.6211
Epoch 8/20
9/9 [==============================] - 0s 253us/sample - loss: 10.3026
Epoch 9/20
9/9 [==============================] - 0s 228us/sample - loss: 7.8066
Epoch 10/20
9/9 [==============================] - 0s 289us/sample - loss: 6.1484
Epoch 11/20
9/9 [==============================] - 0s 214us/sample - loss: 4.9078
Epoch 12/20
9/9 [==============================] - 0s 293us/sample - loss: 3.9176
Epoch 13/20
9/9 [==============================] - 0s 222us/sample - loss: 3.1096
Epoch 14/20
9/9 [==============================] - 0s 252us/sample - loss: 2.4498
Epoch 15/20
9/9 [==============================] - 0s 225us/sample - loss: 1.9152
Epoch 16/20
9/9 [==============================] - 0s 209us/sample - loss: 1.4864
Epoch 17/20
9/9 [==============================] - 0s 347us/sample - loss: 1.1461
Epoch 18/20
9/9 [==============================] - 0s 224us/sample - loss: 0.8789
Epoch 19/20
9/9 [==============================] - 0s 201us/sample - loss: 0.6712
Epoch 20/20
9/9 [==============================] - 0s 265us/sample - loss: 0.5115
Out[18]:
<tensorflow.python.keras.callbacks.History at 0x7fdc045e3cf8>

6. Inference

ลองให้โมเดล predict y จาก x = 10.0

In [19]:
print(model.predict([10.0]))
[[48.67188]]

ปรากฎว่า โมเดล predict ได้ใกล้เคียง กับ 50

7. Save Model

เราจะ Save โมเดลเป็นไฟล์ นามสกุล .h5

In [0]:
import time
saved_model_path = "./{}.h5".format(int(time.time()))

model.save(saved_model_path)

8. TensorFlow.js Model Converter

ใช้ Command Line ด้านล่าง ในการ Convert โมเดลไปเป็น ไฟล์ JSON ชื่อ model.json เพื่อใช้ใน JavaScript ต่อไป และ group1-shard1of1.bin เก็บ Weight ของโมเดล

In [0]:
!tensorflowjs_converter --input_format=keras {saved_model_path} ./
In [0]:
 

จะได้ผลลัพธ์ เป็นไฟล์นามสกุล h5 1 ไฟล์ แปลงเป็นไฟล์ json, bin ได้อย่างละไฟล์ ดังรูป นำไปอัพโหลดบน Web Server เตรียมไว้ขั้นตอนถัดไป

model.json

นอกจากเราจะสามารถแปลง Python-to-JavaScript แล้ว เรายังสามารถ แปลงกลับ JavaScript-to-Python และ JavaScript-to-JavaScript ได้อีกด้วย

ขั้นที่ 2: โหลดโมเดล และรันใน Web Browser

ในขั้นตอนนี้เราจะมาดูโค้ดที่ใช้ในการโหลดโมเดล ที่เรา Save และ Convert เตรียมไว้ด้านบน และรันโมเดลใน Web Browser ให้ผลลัพธ์ออกมาทาง Console และ Alert

TensorFlow.js Code Example

เริ่มต้นด้วยใส่ Code ด้านล่าง ไว้ระหว่าง HTML tag head และ body โค้ดนี้เป็นการโหลด TensorFlow.js

<script src="https://cdn.jsdelivr.net/npm/@tensorflow/[email protected]"> </script>

กำหนด URL ที่เก็บไฟล์โมเดล ในรูปแบบ JSON และสั่งโหลดโมเดลขึ้นมา

            const MODEL_URL = 'model/linear_reg_model.json';        
            const model = await tf.loadLayersModel(MODEL_URL);                
            model.summary()

กำหนดค่า และมิติของ input พร้อม Feed ให้โมเดลทำ predict

            const input = tf.tensor2d([20.0], [1,1]);
            const result = model.predict(input);

Full Source Code

10h_linear_converted_python.html

Inference

ผลลัพธ์ y ที่ได้จาก โมเดล predict x = 20

Result of 10h_linear_converted_python.html
Result of 10h_linear_converted_python.html

model.summary() จะแสดง Model Architecture ที่เราโหลดขึ้นมาจากไฟล์ JSON ในเคสนี้จะมีแค่ y = 5x + 0 มี 2 Parameter เท่านั้น คือ Weight และ Bias

Model Architecture of 10h_linear_converted_python.html
Model Architecture of 10h_linear_converted_python.html

Credit

แชร์ให้เพื่อน:

Keng Surapong on FacebookKeng Surapong on GithubKeng Surapong on Linkedin
Keng Surapong
Project Manager at Bua Labs
The ultimate test of your knowledge is your capacity to convey it to another.

Published by Keng Surapong

The ultimate test of your knowledge is your capacity to convey it to another.

Enable Notifications.    Ok No thanks