é£èŒç¬¬6åã®ç®ç
ãã®åãã2åã«ããããææžãã®æ°åãèªèãããµã³ãã«ãéããŠãPythonã§äœæããKerasã¢ãã«ãTensorFlow.jsã§å©çšããæ¹æ³ãçè§£ããŸãïŒå³1ïŒããã®åã§ã¯ãPythonç°å¢ã®æºåãåŠç¿æžã¿ã¢ãã«ã®æ§ç¯ãè¡ããŸãã
宿ãµã³ãã«
https://github.com/wateryinhare62/mynavi_tensorflowjs/
ä»åã®ããŒããç»åèªèã§ãããã¢ãã«ã®æ§ç¯ãšå©çšãç°ãªããã©ãããã©ãŒã ã§è¡ããŸããå ±éã®ãã©ãŒããããšã³ã³ããŒã¿ãä»ããŠãPythonãã©ãããã©ãŒã ã§æ§ç¯ããã¢ãã«ãTensorFlow.jsããªãã¡Webãã©ãããã©ãŒã ã§å©çšã§ããããšãçè§£ããŸãã
NOTEãµã³ãã«ã«ã€ããŠ
æ¬èšäºã®ãµã³ãã«ã¯ãKerasã®ãã¢ããã°ã©ã ïŒhttps://github.com/keras-team/keras/tree/master/examples/demo_mnist_convnet.pyïŒãäžéšæ¹å€ããŠäœæãå®è¡ããŠããŸãã
MNISTããŒã¿ããŒã¹ãšã¯
ææžãæåèªèã¢ãã«ã®æ§ç¯ã«ã¯ãMNISTãšããããŒã¿ããŒã¹ã䜿çšããŸããMNISTãšã¯ãããŒã¿ããŒã¹æ©æ¢°åŠç¿ãç¹ã«ç»åèªèã¢ãã«ã®åŠç¿ãšè©äŸ¡ã«åºã䜿ãããŠãããææžãæ°åã®ç»åããŒã¿ã®ã»ããã§ããNISTïŒç±³åœåœç«æšæºæè¡ç ç©¶æïŒã®ããŒã¿ãåæ§æããŠäœæããïŒMã¯Modifiedã®æïŒã0ãã9ãŸã§ã®ææžãæ°å6äžæã®èšç·Žçšç»åãšã1äžæã®ãã¹ãçšç»åã§æ§æãããŸããåç»åã«ã¯æ£è§£ãšããŠã0ïœ9ã®ã©ãã«ãä»ããããŠããŸãããã®ããŒã¿ã䜿ã£ãŠã¢ãã«ãèšç·Žããããšã«ãããææžãæ°åã®èªèãå¯èœãªã¢ãã«ãæ§ç¯ããããšãã§ããŸãã
ç»åã¯ã28Ã28ãã¯ã»ã«ã®ã¢ãã¯ãïŒã°ã¬ãŒã¹ã±ãŒã«ïŒç»åãšãªã£ãŠãããèæ¯ã¯é»ãæåéšåã¯çœã§ãããã®ãããäºæž¬ã®éã«ã¯ããŒã¿åœ¢åŒãããã«åãããå¿
èŠããããŸãã
掟çã®ããŒã¿ã»ãããšããŠãææžãã®è±æ°åãå«ããEMNISTãããè¡£æåç»åãéãããFashion-MNISTããªã©ããããŸãã
ã¢ãã«æ§ç¯ç°å¢ã®æ§ç¯
ä»åã¯ãPythonã«ãã£ãŠäœæãããã¢ãã«ãTensorFlow.jsã§å©çšãããšããããŒããªã®ã§ããŸãã¯Pythonç°å¢ã®æ§ç¯ãè¡ããŸãããã ãåã«Pythonãåãã°ãããšããããã§ã¯ãªãããã®åŸã®ããã±ãŒãžã€ã³ã¹ããŒã«ãã¢ãã«æ§ç¯ã¹ã¯ãªãããªã©ãæ£ããåäœããå¿
èŠããããŸããçè
ã詊ãããšãããWindowsã§ãmacOSã§ãäžå
·åãèŠãããã®ã§ãLinuxãã£ã¹ããªãã¥ãŒã·ã§ã³ã§ããUbuntuã§ç°å¢æ§ç¯ãè¡ã£ãŠããããšã«ããŸãã
æ¬çš¿ã§çšããç°å¢ã¯ã以äžã®ãšããã§ããçµã¿åããã«ãã£ãŠã¯åäœããªãå¯èœæ§ãããæšãããããããäºæ¿äžããã
- Windows 11 ProïŒ24H2ïŒ
- Windows Subsystem for Linux 2.8
- Ubuntu 24.04
- Python 3.12.3
- tensorflow 2.19
- tensorflowjs 4.22.0
WSLãæå¹åãUbuntuãã€ã³ã¹ããŒã«ãã
Linuxãšãã£ãŠããWindowsã§ã¯WSLïŒWindows Subsystem for LinuxïŒã䜿ããã®ã§ãããã䜿ã£ãŠLinuxç°å¢ãWindowsäžã«æ§ç¯ããŸããã€ã³ã¹ããŒã«ããUbuntuã¯ãææ°ã®LTSïŒLong Term SupportïŒã§ããUbuntu 24.04ã§ããWSLããã³Ubuntuãã€ã³ã¹ããŒã«æžã¿ãšãã人ã¯ããã®æé ãé£ã°ããŠæ§ããŸããã
ãã¿ãŒããã«ãã¢ããªãèµ·åããŠã以äžã®ã³ãã³ããå®è¡ããŠãã ããã
PS > wsl --install
管çè
æš©éã§ã®å®è¡ãæ±ãããããæ¿è«ŸããŠãã ãããããã€ãã®ãµãã¢ãžã¥ãŒã«ãããŠã³ããŒããå®è¡ãããåŸããæ£åžžã«çµäºããŸãããåèµ·åããå¿
èŠããããŸããããšè¡šç€ºãããã°æåã§ããWindowsãåèµ·åããŠãã ããã
åã³ãã¿ãŒããã«ãã¢ããªãèµ·åããŠãwsl --listã³ãã³ããå®è¡ããŠãã ãããç¶ããŠãäžèЧã«ãUbuntu-24.04ããããããšã確èªããŠãwsl --installã³ãã³ããå®è¡ããŠãã ããã
PS > wsl --list --online
PS > wsl --install Ubuntu-24.04
ã€ã³ã¹ããŒã«ãæžããšããã§ã«Ubuntuã¯èµ·åããŠããããã®ãŸãŸUbuntuäžã®ãŠãŒã¶ã®äœæãšãªããŸãïŒããã³ãããå€åããŠããŸãïŒãã©ã®ãããªãŠãŒã¶åã§ãããïŒWindowsäžã®ãŠãŒã¶ãšåãã§ãOKïŒã®ã§ããŠãŒã¶åãšãã¹ã¯ãŒããæå®ããŠãã ããããªããããã§äœæãããŠãŒã¶ããsudoã³ãã³ãã«ãã管çè
æš©éãå©çšã§ãããŠãŒã¶ãšãªããŸãã
ããã§ãUbuntuã®ããã±ãŒãžã以äžã®ã³ãã³ãã§ææ°ã®ç¶æ
ã«æŽæ°ããŠãããŸãã
$ sudo apt update
âŠãŠãŒã¶ã®ãã¹ã¯ãŒããæ±ãããããå
¥åããâŠ
$ sudo apt upgrade -y
Pythonã®ããŒã«ãã€ã³ã¹ããŒã«ãã
Ubuntu 24.04ã¯Pythonãæšæºã§ãµããŒãããŠããŸããã念ã®ãã確èªããŸãããã以äžã®ã³ãã³ãã§ãããŒãžã§ã³ã確èªã§ããŸãïŒãpythonãã§ã¯ãªããpython3ãã§ãªããšåŒã³åºããªãã®ã§æ³šæããŠãã ããïŒã
$ python3 --version
Python 3.12.3
æšæºã§ã¯ãPythonã®ããã±ãŒãžãããŒãžã£ïŒpipïŒã¯ã€ã³ã¹ããŒã«ãããŠããªãã®ã§ãUbuntuã«çšæãããŠããpipã®ããã±ãŒãžã以äžã®ã³ãã³ãã§ã€ã³ã¹ããŒã«ããŸãã远ã£ãŠå¿ èŠã«ãªãä»®æ³ç°å¢ã®ããã®ããã±ãŒãžvirtualenvãã€ã³ã¹ããŒã«ããŸãã
$ sudo apt install python3-pip
$ sudo apt install python3-virtualenv
ãããã«ã¬ã³ãã¯ãŒãã³ã°ãã£ã¬ã¯ããªãWindowsã®ãã¡ã€ã«ã·ã¹ãã äžã®ãã®ïŒããã³ããã«å«ãŸãããã¹ã/mnt/c/usersâŠãªã©ãšãªã£ãŠããïŒã§ããå Žåã«ã¯ãcdã³ãã³ãã§Linuxãã¡ã€ã«ã·ã¹ãã ã«ããããã®ã«ç§»åããŠãããŸããããWindowsã®ãã¡ã€ã«ã·ã¹ãã ã«ãããå¶çŽã§ãä»®æ³ç°å¢ã®æ§ç¯æã«ãšã©ãŒãçºçããããšãããããã§ãã
ä»®æ³ç°å¢ãæ§ç¯ããŠTensorFlowãã€ã³ã¹ããŒã«ãã
TensorFlowã®ã€ã³ã¹ããŒã«ã«å
ç«ã¡ãPythonã®ä»®æ³ç°å¢ãäœæããŠãããŸããä»®æ³ç°å¢ãšã¯ãPythonã®ã€ã³ã¿ããªã¿ãããã±ãŒãžãç¬ç«ããå Žæã«ãŸãšããŠãããã§ã®äœæ¥ãã·ã¹ãã å
šäœã«åœ±é¿ããªãããããä»çµã¿ã§ããäœæ¥å
容ã«é©ããããŒãžã§ã³ãéžæããããä»®æ³ç°å¢ã¯äžèŠã«ãªã£ããåé€ããŠããŸãã°ãããªã©ãæè»œã«æ±ããã®ãã¡ãªããã§ãã
ä»®æ³ç°å¢ã¯ãäœæ¥å Žæãšãªããã©ã«ãã«äœæããã®ãäžè¬çãªã®ã§ãä»åã®ç®ççšã«é©åœãªãã©ã«ããäœæããŠãã ãããããã§ã¯ãtfjsãã©ã«ããããŒã ãã£ã¬ã¯ããªã«äœæãããã®ãšããŠèª¬æãé²ããŸãã
tfjsãã©ã«ãã«ããããšã確èªããŠã以äžã®ã³ãã³ãã§ä»®æ³ç°å¢ãæ§ç¯ããŸãã
tfjs$ virtualenv -p python3 venv
ããã§ããã©ã«ãvenvãtfjs以äžã«äœæãããä»®æ³ç°å¢ã®äžåŒã眮ãããŸããä»®æ³ç°å¢ã®æå¹åãšç¡å¹åã¯ããããã以äžã®ã³ãã³ãã«ãªããŸãã
tfjs$ source venv/bin/activate æå¹å
âŠä»®æ³ç°å¢ã«ãããäœæ¥âŠ
(venv) tfjs$ ./venv/bin/disactivate ç¡å¹å
ä»®æ³ç°å¢ãã¢ã¯ãã£ãã«ãªããšãããã³ããã®å·Šç«¯ãã(venv)ããšããããã«å€åããŸãã以éã¯ãããã³ããã«æ³šæããªããäœæ¥ããŠãã ããããããŸã§ã®äœæ¥ã§ãããããTensorFlowãã€ã³ã¹ããŒã«ã§ããããã«ãªããŸãããTensorFlow.js圢åŒãžã®ã³ã³ããŒã¿ã¯TensorFlowJsããã±ãŒãžã§æäŸãããã®ã§ãTensorFlowJsããã±ãŒãžãã€ã³ã¹ããŒã«ããŸããTensorFlowããã±ãŒãžãå«ãä»ã®ããã±ãŒãžã¯ãäŸåé¢ä¿ã§èªåçã«ã€ã³ã¹ããŒã«ãããŸããããªãæéããããã®ã§ãæ°é·ã«åŸ ã¡ãŸãããã
(venv) tfjs$ pip3 install tensorflowjs
ã¢ãã«æ§ç¯ã¹ã¯ãªããã®äœæ
å¿ èŠãªãã®ãæã£ãã®ã§ãã¢ãã«æ§ç¯ã¹ã¯ãªããã®äœæã«ç§»è¡ããŸããããäœæãšãã£ãŠããä»åã¯Kerasã®GitHubãªããžããªã«ãããã¢ããã°ã©ã demo_mnist_convnet.pyïŒhttps://github.com/keras-team/keras/tree/master/examples/demo_mnist_convnet.pyïŒãäžéšæ¹å€ããŠäœ¿çšããããšã«ããŸãããã®ãã¡ã€ã«ãããŠã³ããŒãããŠãäœæ¥ãã©ã«ãã«é 眮ããŠãã ããã
ã¢ãã«æ§ç¯ã¹ã¯ãªããã«ä¿åã¹ã¯ãªããã远èšãã
ãã®ãã¡ã€ã«ã®ãã£ãŠããããšã¯è¿œã£ãŠèŠãŠããããšã«ããŠããŸãã¯ä»¥äžã®è¡ããã¡ã€ã«ã®æåŸå°Ÿã«è¿œèšããŠãã ãããããã¯ãæ§ç¯ããã¢ãã«ãå€éšãã¡ã€ã«ã«ä¿åããAPIã®åŒã³åºãã§ãã
model.export('mnist_model')
exportã¡ãœããã¯ãTensorFlowã®SavedModel圢åŒã§ã¢ãã«ãä¿åããŸããä»ã®åœ¢åŒã§ä¿åã§ããsaveã¡ãœãããããã衚1ã®ããã«äœ¿ãåããããŸãã
衚1ïŒã¢ãã«ã®ä¿åAPI
| API | æŠèŠ |
|---|---|
| model.export('xxxx') | TensorFlowã®SavedModel圢åŒã§ä¿å |
| model.save('xxxx.h5) | Kerasã®H5圢åŒã§ä¿åïŒéæšå¥šïŒ |
| model.save('xxxx.keras) | Kerasã®H5圢åŒã§ä¿åïŒéæšå¥šïŒ |
| model.save('xxxx') | Kerasã®SavedModel圢åŒã§ä¿å |
H5圢åŒã¯åç¬ã®ãã¡ã€ã«ã§ãããSavedModel圢åŒã¯åŒæ°ã§æå®ãããã©ã«ããäœæãããããã«ã¢ãã«ã®ãã¡ã€ã«ãé 眮ãããŸãããããã®ãã¡ã€ã«ãçŽæ¥äœ¿ãããšã¯ãªãã®ã§åœ¹å²çã®çè§£ã¯äžèŠã§ãããä»åã®ãµã³ãã«ã§äœ¿ãTensorFlowã®SavedModel圢åŒã衚2ã«æããŠãããŸãã
衚2ïŒTensorFlowã®SavedModel圢åŒã§äœæããããã¡ã€ã«
| ãã¡ã€ã«ïŒãã©ã«ã | æŠèŠ |
|---|---|
| assets/ | èªåœããŒãã«ãåæåããããã®ããã¹ããã¡ã€ã«ãªã©ïŒããã§ã¯ç©ºïŒ |
| variables/ | éã¿ããŒã¿ |
| fingerprint.pb | SavedModelã®ãã£ã³ã¬ãŒããªã³ãïŒããã·ã¥ïŒ |
| saved_model.pb | ã¢ãã«ã¢ãŒããã¯ãã£ãšãã¬ãŒãã³ã°æ§æ |
ã¢ãã«æ§ç¯ã¹ã¯ãªããã®åºåãèŠãŠã¿ã
ãã®ã¹ã¯ãªãããå®è¡ãããšã以äžã®ãããªåºåãåŸãããŸããèŠåãæ å ±ã¯çããŠãããŸãã
(venv) ~$ python3 demo_mnist_convnet.py
x_train shape: (60000, 28, 28, 1) (1)
60000 train samples (2)
10000 test samples
Model: "sequential" (3)
âââââââââââââââââââââââââââââââââââ³âââââââââââââââââââââââ ââ³ââââââââââââââââ
â Layer (type) â Output Shape â Param # â
â¡ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ âââââââââââââââââ©
â conv2d (Conv2D) â (None, 26, 26, 32) â 320 â
âââââââââââââââââââââââââââââââââââŒâââââââââââââââââââââââ ââŒââââââââââââââââ€
â max_pooling2d (MaxPooling2D) â (None, 13, 13, 32) â 0 â
âââââââââââââââââââââââââââââââââââŒâââââââââââââââââââââââââŒââââââââââââââââ€
â conv2d_1 (Conv2D) â (None, 11, 11, 64) â 18,496 â
âââââââââââââââââââââââââââââââââââŒâââââââââââââââââââââââââŒââââââââââââââââ€
â max_pooling2d_1 (MaxPooling2D) â (None, 5, 5, 64) â 0 â
âââââââââââââââââââââââââââââââââââŒâââââââââââââââââââââââââŒââââââââââââââââ€
â flatten (Flatten) â (None, 1600) â 0 â
âââââââââââââââââââââââââââââââââââŒâââââââââââââââââââââââââŒââââââââââââââââ€
â dropout (Dropout) â (None, 1600) â 0 â
âââââââââââââââââââââââââââââââââââŒâââââââââââââââââââââââââŒââââââââââââââââ€
â dense (Dense) â (None, 10) â 16,010 â
âââââââââââââââââââââââââââââââââââŽâââââââââââââââââââââââââŽââââââââââââââââ
Total params: 34,826 (136.04 KB) (4)
Trainable params: 34,826 (136.04 KB)
Non-trainable params: 0 (0.00 B)
Epoch 1/3 (5)
422/422 ââââââââââââââââââââ 17s 37ms/step - accuracy: 0.8855 - loss: 0.3780 - val_accuracy: 0.9760 - val_loss: 0.0878
Epoch 2/3
422/422 ââââââââââââââââââââ 20s 36ms/step - accuracy: 0.9627 - loss: 0.1206 - val_accuracy: 0.9815 - val_loss: 0.0666
Epoch 3/3
422/422 ââââââââââââââââââââ 16s 38ms/step - accuracy: 0.9718 - loss: 0.0913 - val_accuracy: 0.9875 - val_loss: 0.0481
Test loss: 0.04890444129705429 (6)
Test accuracy: 0.9843999743461609
Saved artifact at 'mnist_model'. The following endpoints are available:
* Endpoint 'serve'
args_0 (POSITIONAL_ONLY): TensorSpec(shape=(None, 28, 28, 1), dtype=tf.float32, name='keras_tensor')
Output Type:
TensorSpec(shape=(None, 10), dtype=tf.float32, name=None)
Captures:
126736075415120: TensorSpec(shape=(), dtype=tf.resource, name=None)
126736075416464: TensorSpec(shape=(), dtype=tf.resource, name=None)
126736075418576: TensorSpec(shape=(), dtype=tf.resource, name=None)
126736075417232: TensorSpec(shape=(), dtype=tf.resource, name=None)
126736075417616: TensorSpec(shape=(), dtype=tf.resource, name=None)
126736075419152: TensorSpec(shape=(), dtype=tf.resource, name=None)
ããªãé·ãã®ã§ããããããŸã§ã®åã§åŠãã å
容ã®å»¶é·ãšãªã£ãŠããŸããç°¡åã«å
容ã説æããŸãã
ïŒ1ïŒã¯ãèšç·ŽããŒã¿ã60,000åã圢ç¶ã¯28Ã28ãã«ã©ãŒã¢ãŒãã¯1ããªãã¡ã°ã¬ãŒã¹ã±ãŒã«ã§ããæšã®åºåã§ãã
ïŒ2ïŒã¯ãèšç·ŽããŒã¿ã60,000åããã¹ãããŒã¿ã10,000åã§ããããšã瀺ããŠããŸãã
ïŒ3ïŒã¯ãã¢ãã«ãSequentialã¢ãã«ã§ããããšã衚ããŠããŸããSequentialã¢ãã«ã«ã€ããŠã¯ã第2åã§ç°¡åã«ç޹ä»ããŸãããå
¥åºåããšãã«1åã§ãå±€ãäžçŽç·ã«ã€ãªããã¢ãã«ã§ããmodelã®summaryã¡ãœããã«ããåŸãããåºåã§ãã
ïŒ4ïŒã¯ããã©ã¡ãŒã¿ã®ç·æ°ãšãèšç·Žå¯èœãªãã©ã¡ãŒã¿ãèšç·Žäžèœãªãã©ã¡ãŒã¿ã®æ°ã瀺ããŠããŸãã
ïŒ5ïŒã¯ãšããã¯ïŒåŠç¿åæ°ïŒã衚ããŠããããã®å Žåã¯3åã§ãåæ°ãçµãããšã«accuracyïŒæ£ç¢ºæ§ïŒãåäžããŠããããšãèªã¿åããŸãã
ïŒ6ïŒã¯ããã¹ãçµæãšããŠã®æå€±ïŒlossïŒãšæ£ç¢ºæ§ïŒaccuracyïŒã§ããååã«äœãlossïŒ0.048ïŒãšé«ãaccuracyïŒ0.984ïŒãåŸãããŠããããšã確èªã§ããŸããã
ãŸãšã
ä»åã¯ãMNISTããŒã¿ããŒã¹ãå©çšããææžãæ°åã®èªèã®æºåãšããŠãPythonã«ããã¢ãã«ããŒã¿ã®ä¿åã«ã€ããŠç޹ä»ããŸãããæé ã¯ããè€éã§ãããWindowsäžã«TensorFlowã®å©çšç°å¢ãæ§ç¯ããäžã€ã®è§£ã瀺ããã®ã§ã¯ãªãããšæããŸãã æ¬¡åã¯ãMNISTããŒã¿ããŒã¹ãå©çšããææžãæ°åã®èªèã®ç¶ç·šãšããŠãä¿åããã¢ãã«ããŒã¿ãTensorFlow.jsã§èªã¿èŸŒã¿ãCanvasäžã«ææžãããæ°åãèªèããããµã³ãã«ã玹ä»ããŸãã
WINGSãããžã§ã¯ã å±±å çŽïŒèïŒ å±±ç° ç¥¥å¯ïŒç£ä¿®ïŒ
æéäŒç€Ÿ WINGSãããžã§ã¯ããéå¶ããããã¯ãã«ã«å·çã³ãã¥ããã£ïŒä»£è¡šå±±ç°ç¥¥å¯ïŒãäž»ã«Webéçºåéã®æžç±ïŒèšäºå·çã翻蚳ãè¬æŒçãå¹ åºãæããããçŸåšãå·çã¡ã³ããŒãåéäžãèå³ã®ããæ¹ã¯ãã©ãã©ãå¿åé ããããèæžãèšäºå€æ°ã
RSS
X:@WingsPro_infoïŒå ¬åŒïŒã@WingsPro_info/wingsïŒã¡ã³ããŒãªã¹ãïŒïŒèè ã«ã€ããŠïŒ
WINGSãããžã§ã¯ãæå±ã®ãã¯ãã«ã«ã©ã€ã¿ãŒãåºç瀟ãçµãŠããªãŒã©ã³ã¹ãšããŠç¬ç«ãã©ã€ã¿ãŒããšãã£ã¿ãŒãããããããŒãè¬åž«æ¥ã«åŸäºãå±å·ã¯ãããŸããžããã
