Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
JavaScriptでも機械学習がやりたかった話
Search
yujiosaka
November 07, 2018
Programming
490
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
JavaScriptでも機械学習がやりたかった話
yujiosaka
November 07, 2018
More Decks by yujiosaka
See All by yujiosaka
I was understanding WASM all wrong! 🤯
yujiosaka
2
330
Machine Learning with JavaScript
yujiosaka
0
230
ヘッドレスChromeでクローラを作った後の話
yujiosaka
3
740
俺が最初にヘッドレスChromeでクローラ作った 事になんねーかな
yujiosaka
4
1.4k
『XXX』のための管理画面
yujiosaka
1
1.5k
Enjoy Deep Learning by JavaScript
yujiosaka
1
400
ひたすら楽してディープラーニング
yujiosaka
20
13k
technology x business
yujiosaka
3
610
第二回もんご祭 パネルディスカッション
yujiosaka
0
930
Other Decks in Programming
See All in Programming
Embedded SREと共に達成した会員管理システムのAWS移行 - SRE NEXT 2026 ランチスポンサーセッション
niftycorp
PRO
1
2.3k
Observability in Practice:Grafana 與 Edge Device SRE 的那些事
blueswen
0
190
どこまでゆるくて許されるのか
tk3fftk
0
470
ECSアプリログをFireLensでコスト削減しようとしたけど諦めた話 in Fargate×Node.js
akihisaikeda
2
4.2k
エンジニア向け会社紹介/Findy Company Profile
findyinc
6
360k
Claude Team Plan導入・ガイド
tk3fftk
0
170
トークンをケチるな、設計しろ:GitHub Copilotを賢く使うコンテキスト戦略
ochtum
0
310
吝嗇家のためのAI活用 / AI development for miser - ChatGPT + Issue Driven Development
tooppoo
0
180
「なぜそう決めたのか」を残し続ける仕組み ― Notion AI カスタムエージェント × Slack連携による設計判断の自動記録 - NIKKEI Tech Talk #47
niftycorp
PRO
0
260
【やさしく解説 設計編・中級 #4】ルールの寿命と、システムの年輪
panda728
PRO
2
120
はてなアカウント基盤 State of the Union
cockscomb
1
1.3k
初めてのKubernetes 本番運用でハマった話
oku053
0
120
Featured
See All Featured
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
420
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.8k
Navigating Team Friction
lara
192
16k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
1.5k
Exploring anti-patterns in Rails
aemeredith
3
440
WENDY [Excerpt]
tessaabrams
11
38k
Java REST API Framework Comparison - PWX 2021
mraible
34
9.5k
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.1k
Raft: Consensus for Rubyists
vanstee
141
7.6k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
490
Transcript
Yuji Isobe JavaScriptͰ ػցֶश͕Γ͔ͨͬͨ Emotion Intelligence × GIGษڧձ
Ϛωʔδϟʔ ϝϯςφʔ @yujiosaka github.com/yujiosaka/headless-chrome-crawler
ձࣾ www.emin.co.jp
એᶃ www.zenclerk.com/
ϏδωεɾOSSϚΠϯυΛ࣋ͬͨΤϯδχΞืूʂ એᶄ www.wantedly.com/projects/233437
ຊ
1.JavaScriptͰػցֶशͲ͜·ͰͰ͖Δͷ͔ 2.JavaScriptΛ͏ϝϦοτͱσϝϦοτ 3.۩ମతͳ࣮ݱํ๏ͱσϞ ຊͷςʔϚ
ͦͦJavaScriptͰ ػցֶशͬͯ·ͱʹͰ͖Μͷʁ
JavaScriptͰσΟʔϓϥʔχϯά speakerdeck.com/yujiosaka/hitasurale-sitedeipuraningu github.com/yujiosaka/js-mind XXXSFEEJUDPNSOPEFDPNNFOUTEH KT@NJOE@EFFQ@MFBSOJOH@MJCSBSZ@XSJUUFO@JO@FT ͳΜͰJavaScriptͰ͜Μͳ͜ͱͨ͠Μͩʁ ͦΜͳͷStarཉ͠͞ʹܾ·ͬͯΔͰ͠ΐ
ਤ
࣌ͷΦν TQFBLFSEFDLDPNZVKJPTBLBIJUBTVSBMFTJUFEFJQVSBOJOHV TMJEF
࣌ͷΦν TQFBLFSEFDLDPNZVKJPTBLBIJUBTVSBMFTJUFEFJQVSBOJOHV TMJEF
A. օ͕ͬͯΔ͔Βศརʹͳ͍ͬͯ͘ Q. ͳͥσʔλαΠΤϯεPythonʁ trends.google.co.jp/trends/explore?date=today%205-y&geo=JP&q=JavaScript,Python,AI
NumPy/Pandas - ߴɾߴػೳͳߦྻܭࢉ Matplotlib/seaborn - ख͔ܰͭߴػೳͳάϥϑඳը Jupiter Notebook - ࢼߦࡨޡ͕Γ͍͢
scikit-learn - ڞ௨ͷػցֶशAPIΛఏڙ͢Δ TensorFlow/PyTorch - GPUΛͬͨߴͳਂֶश ... σʔλαΠΤϯεΛࢧ͑ΔPython Cݴޠ࣮ʴSIMD໋ྩʴֶతͳ࠷దԽʴ؆ܿͳهड़
NumPyΛͬͨߴͳߦྻܭࢉ > import time > import numpy as np >
a = np.random.random((1000, 1000)) > b = np.random.random((1000, 1000)) > t = time.time() > np.dot(a, b) > print(time.time() - t) 0.08162903785705566 Python + NumPy > const math = require('mathjs'); > const a = math.random([1000, 1000]); > const b = math.random([1000, 1000]); > const t = Date.now(); > math.multiply(a, b); > console.log((Date.now() - t) / 1000); 135.587 JavaScript + math.js
NumPy/Pandas - ߴɾߴػೳͳߦྻܭࢉ Matplotlib/seaborn - ख͔ܰͭߴػೳͳάϥϑඳը Jupiter Notebook - ࢼߦࡨޡ͕Γ͍͢
scikit-learn - ڞ௨ͷػցֶशAPIΛఏڙ͢Δ TensorFlow/PyTorch - GPUΛͬͨߴͳਂֶश ... σʔλαΠΤϯεΛࢧ͑ΔPython γϯϓϧͳΠϯλʔϑΣʔεʢfit, transform, predictʣ
XGBoost ͔Β LightGBM ͷΓସ͕͑ߦͰྃ scikit-learnͷҰ؏ͨ͠ػցֶशAPI github.com/dmlc/xgboost/ github.com/Microsoft/LightGBM
NumPy/Pandas - ߴɾߴػೳͳߦྻܭࢉ Matplotlib/seaborn - ख͔ܰͭߴػೳͳάϥϑඳը Jupiter Notebook - ࢼߦࡨޡ͕Γ͍͢
scikit-learn - ڞ௨ͷػցֶशAPIΛఏڙ͢Δ TensorFlow/PyTorch - GPUΛͬͨߴͳਂֶश ... σʔλαΠΤϯεΛࢧ͑ΔPython
σʔλαΠΤϯεΔͳΒ Pythonʢ·ͨRʣͬ͠ΐ
͚ͩͲ…
ػցֶश͚ͩͳΒ͘͠ͳ͍
JavaScriptͰͰ͖ͪΌ͏ʂ
- σʔλαΠΤϯεʹ ֶɾ౷ܭࣝͱϋοΩϯά εΩϧ͚ͩͰͳ͘ɺਂ͍ ઐੑ͕ٻΊΒΕΔ σʔλαΠΤϯεͱػցֶशͷҧ͍ ESFXDPOXBZDPN[JBUIFEBUBTDJFODFWFOOEJBHSBN ਂ͍ઐੑ ϋοΩϯά εΩϧ
ֶɾ ౷ܭࣝ ػց ֶश جૅ ݚڀ ةݥ κʔϯ σʔλ αΠΤϯε
σʔλαΠΤϯεͱػցֶशͷҧ͍ ESFXDPOXBZDPN[JBUIFEBUBTDJFODFWFOOEJBHSBN ϋοΩϯά εΩϧ ֶɾ ౷ܭࣝ ػց ֶश - ֶɾ౷ܭࣝͱ
ϋοΩϯάεΩϧ͑͋͞Εɺ ػցֶशͰ͖Δ
ਂ͍ઐੑ͕ͳͨͬͯ͘ ػցֶश͍͍ͯ͠͡Όͳ͍ ΤϯδχΞͩͷ
NumPy/Pandas - ߴɾߴػೳͳߦྻܭࢉ Matplotlib/seaborn - ख͔ܰͭߴػೳͳάϥϑඳը Jupiter Notebook - ࢼߦࡨޡ͕Γ͍͢
scikit-learn - ڞ௨ͷػցֶशAPIΛఏڙ͢Δ TensorFlow/PyTorch - GPUΛͬͨߴͳਂֶश ... σʔλαΠΤϯεΛࢧ͑ΔPython TensorFlow.js / brain.js
from tensorflow.contrib.keras.python import keras import numpy as np model =
keras.Sequential() model.add(keras.layers.Dense(units=1, input_shape=[1])) model.compile(optimizer='sgd', loss='mean_squared_error') xs = np.array([[1], [2], [3], [4]]) ys = np.array([[1], [3], [5], [7]]) model.fit(xs, ys, epochs=1000) print(model.predict(np.array([[5]]))) TensorFlow Keras
import * as tf from '@tensorlowjs/tfjs'; const model = tf.sequential();
model.add(tf.layers.dense({units: 1, inputShape: [1]})); model.compile({optimizer: 'sgd', loss: 'meanSquaredError'}); const xs = tf.tensor2d([[1], [2], [3], [4]], [4, 1]); const ys = tf.tensor2d([[1], [3], [5], [7]], [4, 1]); await model.fit(xs, ys, {epochs: 1000}); model.predict(tf.tensor2d([[5]], [1, 1])).print(); TensorFlow.js WebGLΛͬͨGPUܭࢉ
ͰͲ͏͍ͤΜͰ͠ΐʁ
- WebGLΛͬͨTensorFlow.js AVXΛͬͨTensorFlowͷ1.5-2ഒ͍ - ڊେͳϞσϧͷֶश10-15ഒ͔͔Δ͜ͱ͋Δ WebGLΛͬͨGPUܭࢉ KTUFOTPSqPXPSHGBR
࣮༻తʹͳΓͭͭ͋Δ
͞Βʹ
- SIMD໋ྩͱWeb Assembly͕αϙʔτ͞ΕΔ - େ෯ͳύϑΥʔϚϯε্͕ظ͞ΕΔ TensorFlow.js 2.0ͷϩʔυϚοϓ www.tensorflow.org/community/roadmap
JavaScriptͬͯͳΜ͔ ͍͍͜ͱ͋Μͷʁ
- TypeScript͕͑Δ - Universal/Isomorphic JavaScriptͷ࣮ݱ - ๛ͳNPMύοέʔδ͕׆༻Ͱ͖Δ - ඇಉظͳΦϯϥΠϯֶशʹద͍ͯ͠Δ -
ϒϥβͷϦιʔεΛ༗ޮ׆༻Ͱ͖Δ JavaScriptͰػցֶशΛߦ͏ϝϦοτ
ϒϥβ্ͰTensorFlow.jsΛಈ͔͢ qiita.com/kaneU/items/ca84c4bfcb47ac53af99
Ϧιʔεʢˇʣ͕અͰ͖Δʂ
- ϒϥβ্Ͱಛྔͷநग़ɺมɺ༧ଌΛߦ͏ͨΊ ίϐϖ͢Ε୭ͰίϐʔαΠτ͕࡞Εͯ͠·͏ - ΞϧΰϦζϜͰͳ͘ɺಛྔ͕ͦ͜ڝ૪ྗͷݯઘ - ୭͕࡞ͬͯಉ͡ͷ͕Ͱ͖Δ߹͚ͩʹཹΊΔ ※ϦόʔεΤϯδχΞϦϯάʹ ऑ͍ͷͰϏδωεͰҙ͕ඞཁ
Googleͷ2018ΤΠϓϦϧϑʔϧ ωλͰTensorFlow.js͕ΘΕͨ landing.google.co.jp/tegaki/
- ѹతͳใෆ - ߦྻܭࢉ͕؆ܿʹهड़Ͱ͖ͳ͍ - ػցֶशAPI͕ڞ௨Խ͞Ε͍ͯͳ͍ - ࠷৽ͷΞϧΰϦζϜ͕͙͢ʹར༻Ͱ͖ͳ͍ - ධՁؔͷपลϥΠϒϥϦ͕ෆ͍ͯ͠Δ
JavaScriptͰػցֶशΛߦ͏σϝϦοτ
- 1ͭ1ͭେͨ͜͠ͱͷͳ͍͕ؔͩɺ ͡Ί͔Βἧ͍ͬͯΔͱ͋Γ͕ͨΈΛ࣮ײ͢Δ ... from sklearn.cross_validation import train_test_split from sklearn.grid_search
import GridSearchCV from sklearn.metrics import classification_report ... X_train, X_test, y_train, y_test = train_test_split(X, y) ... clf = GridSearchCV(...) ... report = classification_report(y_test, y_pred) ... scikit-learnͰΑ͘ݟΒΕΔίʔυ
Python͔ʁJavaScript͔ʁ - ຊؾͰσʔλαΠΤϯεΛ͢ΔͳΒPython - Ұ͔ΒػցֶशͷΞϓϦΛ࡞ΔͳΒPython - ͪΐͬͱͨ͠ػցֶश͚ͩͳΒԿͰ͍͍ - JavaScriptܾͯ͠ѱ͍બࢶͰͳ͍
ͲΜͳΓํ͕͋Δͷʁ
TensorFlow.js - χϡʔϥϧωοτϫʔΫɾਂֶश brain.js - χϡʔϥϧωοτϫʔΫɾਂֶश Synaptic - χϡʔϥϧωοτϫʔΫɾਂֶश Natural
- ࣗવݴޠॲཧ ml.js - ༷ʑͳػցֶशϥΠϒϥϦ܈ math.js - ౷ܭɾߦྻܭࢉ JavaScriptʹΑΔػցֶशϥΠϒϥϦ js.tensorflow.org github.com/BrainJS caza.la/synaptic/ github.com/NaturalNode/natural mathjs.org github.com/mljs χϡʔϥϧωοτϫʔΫࣗମൺֱత୯७ͳߦྻܭࢉ
TensorFlow.js - χϡʔϥϧωοτϫʔΫɾਂֶश brain.js - χϡʔϥϧωοτϫʔΫɾਂֶश Synaptic - χϡʔϥϧωοτϫʔΫɾਂֶश Natural
- ࣗવݴޠॲཧ ml.js - ༷ʑͳػցֶशϥΠϒϥϦ܈ math.js - ౷ܭɾߦྻܭࢉ JavaScriptʹΑΔػցֶशϥΠϒϥϦ js.tensorflow.org github.com/BrainJS caza.la/synaptic/ github.com/NaturalNode/natural mathjs.org github.com/mljs
σϞ
> const iris = require('ml-dataset-iris'); > const { RandomForestClassifier }
= require('ml-random- forest'); > > const CLASSES = ['setosa', 'versicolor', 'virginica']; > > const X = iris.getNumbers(); > const y = iris.getClasses().map(cls => > CLASSES.indexOf(cls) > ); > const classifier = new RandomForestClassifier(); > classifier.train(X, y); > classifier.predict(X); > classifier.predict([ 6.7, 3, 5, 1.7 ]); [ 2 ] // 'virginica' mljs
JavaScriptͰ ػցֶश͕Γ͔ͨͬͨ ڪΕΔʹΒͳ͍