TensorFlow.jsã§ã¯ã©ã€ã¢ã³ããµã€ãæ©æ¢°åŠç¿ã®äžçãæ¢æ±ããŸãããããã©ãŠã¶ã§çŽæ¥AIã¢ãã«ãæ§ç¯ã»ãããã€ããæ¹æ³ãåŠã³ãã€ã³ã¿ã©ã¯ãã£ãã§ã€ã³ããªãžã§ã³ããªWebã¢ããªã±ãŒã·ã§ã³ã®æ°ããªå¯èœæ§ãåãéããŸãã
JavaScriptæ©æ¢°åŠç¿ïŒTensorFlow.jsãšã¯ã©ã€ã¢ã³ããµã€ãAI
人工ç¥èœïŒAIïŒã®äžçã¯æ¥éã«é²åããŠãããæããšããµã€ãã£ã³ã°ãªçºå±ã®äžã€ããWebãã©ãŠã¶å ã§çŽæ¥æ©æ¢°åŠç¿ã¢ãã«ãå®è¡ã§ããããã«ãªã£ãããšã§ãããããå¯èœã«ããŠããã®ããäž»èŠãªæ©æ¢°åŠç¿ãã¬ãŒã ã¯ãŒã¯ã§ããTensorFlowã®ãã¯ãŒãJavaScriptãšã³ã·ã¹ãã ã«ããããTensorFlow.jsã®ãããªã©ã€ãã©ãªã§ãã
TensorFlow.jsãšã¯ïŒ
TensorFlow.jsã¯ããã©ãŠã¶ãšNode.jsã§æ©æ¢°åŠç¿ã¢ãã«ãèšç·Žã»ãããã€ããããã®JavaScriptã©ã€ãã©ãªã§ããããã«ãããéçºè ã¯ä»¥äžã®ããšãå¯èœã«ãªããŸãïŒ
- JavaScriptã§MLã¢ãã«ãéçºïŒãµãŒããŒãµã€ãã®ã€ã³ãã©ã«äŸåããããšãªãããã©ãŠã¶ã§çŽæ¥MLã¢ãã«ãäœæãèšç·Žãå®è¡ã§ããŸãã
- æ¢åã¢ãã«ã®å©çšïŒèšç·Žæžã¿ã®TensorFlowã¢ãã«ãã€ã³ããŒãããããä»ã®ãã¬ãŒã ã¯ãŒã¯ã®ã¢ãã«ã倿ããŠãã©ãŠã¶ã§å®è¡ãããã§ããŸãã
- GPUã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ã®æŽ»çšïŒãŠãŒã¶ãŒã®ããã€ã¹ã®GPUãæŽ»çšããã¢ãã«ã®èšç·Žãšæšè«ïŒäºæž¬ïŒãé«éåã§ããŸãã
ãªãã¯ã©ã€ã¢ã³ããµã€ãæ©æ¢°åŠç¿ãªã®ãïŒ
åŸæ¥ãæ©æ¢°åŠç¿ã¢ãã«ã¯ãµãŒããŒã«ãããã€ãããŠããŸããããŠãŒã¶ãŒãAIæèŒã¢ããªã±ãŒã·ã§ã³ãæäœãããšããã®å ¥åã¯ãµãŒããŒã«éä¿¡ãããã¢ãã«ã«ãã£ãŠåŠçãããçµæããŠãŒã¶ãŒã«è¿ãããŸããããããã¯ã©ã€ã¢ã³ããµã€ãæ©æ¢°åŠç¿ã§ã¯ããã®èšç®ããŠãŒã¶ãŒã®ãã©ãŠã¶ã«ç§»è¡ããŸããããã«ã¯ããã€ãã®å©ç¹ããããŸãïŒ
- äœé å»¶ïŒããŒã¿ãããŒã«ã«ã§åŠçããããšã§ãããã¯ãŒã¯é å»¶ããªããªããå¿çæéãççž®ãããããã¬ã¹ãã³ã·ããªãŠãŒã¶ãŒäœéšãå®çŸããŸãããªã¢ã«ã¿ã€ã 翻蚳ã¢ããªãæ³åããŠã¿ãŠãã ããããã©ãŠã¶ã§é³å£°ãåŠçããããšã§ãå³åº§ã«ãã£ãŒãããã¯ãåŸãããŸãã
- ãã©ã€ãã·ãŒã®åŒ·åïŒããŒã¿ã¯ãŠãŒã¶ãŒã®ããã€ã¹äžã§åŠçããããããæ©å¯æ å ±ããªã¢ãŒããµãŒããŒã«éä¿¡ããå¿ èŠæ§ãæžå°ããŸããããã¯ãå»çèšé²ãè²¡åæ å ±ãªã©ãå人ããŒã¿ãæ±ãã¢ããªã±ãŒã·ã§ã³ã«ãšã£ãŠç¹ã«éèŠã§ãããŠãŒã¶ãŒã®ããã¹ããææ åæããããŒã«ãèããŠã¿ãŸãããããããããŒã«ã«ã§åŠçããã°ããã©ã€ããŒããªå¯èœæ§ã®ããéä¿¡ããµãŒããŒã«éä¿¡ããã®ãé¿ããããŸãã
- ãªãã©ã€ã³æ©èœïŒãŠãŒã¶ãŒããªãã©ã€ã³ã®å Žåã§ãã¢ãã«ãå®è¡ã§ãããããã€ã³ã¿ãŒãããæ¥ç¶ãå¶éãããŠããããŸãã¯å šããªãç°å¢ã§ãAIæèŒæ©èœãå©çšã§ããŸããäŸãã°ãæ€ç©ãèå¥ããã¢ãã€ã«ã¢ããªã¯ãæºåž¯é»è©±ã®é»æ³¢ãå±ããªãé éå°ã§ãæ©èœããŸãã
- ãµãŒããŒè² è·ã®è»œæžïŒèšç®ãã¯ã©ã€ã¢ã³ãã«ãªãããŒãããããšã§ãµãŒããŒã®è² è·ã軜æžãããã€ã³ãã©ã³ã¹ãã®åæžãã¹ã±ãŒã©ããªãã£ã®åäžã«ã€ãªããå¯èœæ§ããããŸããç»åèªèæ©èœãæã€ãŠã§ããµã€ãã¯ãç»åãã¯ã©ã€ã¢ã³ããµã€ãã§åŠçããããšã§ãµãŒããŒã®åž¯åå¹ ãåæžã§ããŸãã
TensorFlow.jsã®ãŠãŒã¹ã±ãŒã¹
TensorFlow.jsã¯ãã€ã³ããªãžã§ã³ãã§ã€ã³ã¿ã©ã¯ãã£ããªWebã¢ããªã±ãŒã·ã§ã³ãäœæããããã®å¹ åºãå¯èœæ§ãåãéããŸãã以äžã«ã泚ç®ãã¹ããŠãŒã¹ã±ãŒã¹ãããã€ã玹ä»ããŸãïŒ
1. ãªã¢ã«ã¿ã€ã ç©äœæ€åºãšç»åèªè
ç»åãåç»ã®äžã®ç©äœããã©ãŠã¶ã§çŽæ¥ããªã¢ã«ã¿ã€ã ã«èå¥ããŸããããã¯ä»¥äžã®ãããªçšéã«å©çšã§ããŸãïŒ
- ã€ã³ã¿ã©ã¯ãã£ãã²ãŒã ïŒãã¬ã€ã€ãŒã®åããã²ãŒã ç°å¢å ã®ãªããžã§ã¯ããæ€åºããŸãã
- æ¡åŒµçŸå®ïŒARïŒã¢ããªã±ãŒã·ã§ã³ïŒæ€åºãããç©äœã«åºã¥ããŠãçŸå®äžçã«ããžã¿ã«æ å ±ãéãåãããŸãã
- ã¢ã¯ã»ã·ããªãã£ããŒã«ïŒèŠèŠé害ã®ãããŠãŒã¶ãŒãåšå²ã®ç©äœãèå¥ããã®ãå©ããŸãã
äŸãã°ãå°å£²åºã®ãŠã§ããµã€ãã§ã¯ãTensorFlow.jsã䜿ã£ãŠãŠãŒã¶ãŒã®äœåãæ€åºããè¡£æã®ç»åãéãåãããããšã§ãä»®æ³çã«è¡£é¡ãã詊çããããããšãã§ããŸãã
2. èªç¶èšèªåŠçïŒNLPïŒ
人éã®èšèªããã©ãŠã¶ã§çŽæ¥åŠçããçè§£ããŸããå¿çšäŸã«ã¯ä»¥äžãå«ãŸããŸãïŒ
- ææ åæïŒããã¹ãã®ææ çãªããŒã³ã倿ãã顧客ããã®ãã£ãŒãããã¯åæããœãŒã·ã£ã«ã¡ãã£ã¢ã®ã¢ãã¿ãªã³ã°ã«åœ¹ç«ãŠãŸãã
- ããã¹ãåé¡ïŒããã¹ããããŸããŸãªã«ããŽãªã«åé¡ããŸããã¹ãã æ€åºããããã¯ã¢ããªã³ã°ãªã©ãæããããŸãã
- èšèªç¿»èš³ïŒèšèªéã§ããã¹ãããªã¢ã«ã¿ã€ã ã«ç¿»èš³ããŸãã
ã«ã¹ã¿ããŒãµãŒãã¹ã®ãã£ãããããã¯ãTensorFlow.jsã䜿çšããŠãŠãŒã¶ãŒã®å ¥åãåæãããµãŒããŒã«ããŒã¿ãéä¿¡ããããšãªããããé¢é£æ§ã®é«ãå¿çãæäŸã§ããŸãã
3. å§¿å¢æšå®
ç»åãåç»ãã人éã®å§¿å¢ãæ€åºã»è¿œè·¡ããŸãããŠãŒã¹ã±ãŒã¹ã«ã¯ä»¥äžãå«ãŸããŸãïŒ
- ãã£ãããã¹ã¢ããªã±ãŒã·ã§ã³ïŒãŠãŒã¶ãŒã®åãã远跡ãããšã¯ãµãµã€ãºã®ãã©ãŒã ã«é¢ãããã£ãŒãããã¯ãæäŸããŸãã
- ã€ã³ã¿ã©ã¯ãã£ãã€ã³ã¹ã¿ã¬ãŒã·ã§ã³ïŒãŠãŒã¶ãŒã®åãã«åå¿ããã€ã³ã¿ã©ã¯ãã£ããªäœéšãåµåºããŸãã
- ã»ãã¥ãªãã£ã·ã¹ãã ïŒç°åžžãªåããè¡åãæ€åºããŸãã
å§¿å¢æšå®ãå©çšããŠãããªãã®ãã³ã¹ã®ãã¯ããã¯ã«ãªã¢ã«ã¿ã€ã ã§ãã£ãŒãããã¯ãæäŸããä»®æ³ãã³ã¹ã€ã³ã¹ãã©ã¯ã¿ãŒãæ³åããŠã¿ãŠãã ããã
4. ã¹ã¿ã€ã«å€æ
ããç»åã®ã¹ã¿ã€ã«ãå¥ã®ç»åã«é©çšããèžè¡çãªå¹æãçã¿åºããŸããããã¯ä»¥äžã®ããã«å©çšã§ããŸãïŒ
- ç»åç·šéããŒã«ïŒãŠãŒã¶ãŒããŠããŒã¯ã§èŠèŠçã«é åçãªç»åãäœæã§ããããã«ããŸãã
- èžè¡çãã£ã«ã¿ãŒïŒããŸããŸãªèžè¡ã¹ã¿ã€ã«ããªã¢ã«ã¿ã€ã ã§ç»åã«é©çšããŸãã
ãœãŒã·ã£ã«ã¡ãã£ã¢ã¢ããªã§ã¯ãã¹ã¿ã€ã«å€æã¢ãã«ã䜿ã£ãŠããŠãŒã¶ãŒãèªåã®åçãå³åº§ã«å°è±¡æŽŸã®çµµç»ã®ããã«å€æã§ããããã«ããããšãã§ããŸãã
5. ããŒãœãã©ã€ãŒãŒã·ã§ã³ãšã¬ã³ã¡ã³ããŒã·ã§ã³
ãµãŒããŒã«ããŒã¿ãéä¿¡ããããšãªãããŠãŒã¶ãŒã®è¡åã«åºã¥ããŠããŒãœãã©ã€ãºãããäœéšãæ§ç¯ããŸããããã¯ä»¥äžã®ããã«å©çšã§ããŸãïŒ
- Eã³ããŒã¹ïŒé²èЧ履æŽã«åºã¥ããŠååãæšèŠããŸãã
- ã³ã³ãã³ããã©ãããã©ãŒã ïŒèŠèŽç¿æ £ã«åºã¥ããŠèšäºãåç»ãææ¡ããŸãã
ãªã³ã©ã€ã³åŠç¿ãã©ãããã©ãŒã ã§ã¯ãTensorFlow.jsã䜿çšããŠãçåŸã®æçžŸãåŠç¿ã¹ã¿ã€ã«ã«åºã¥ããŠåŠç¿ãã¹ãããŒãœãã©ã€ãºããããšãã§ããŸãã
TensorFlow.jsãå§ãã
TensorFlow.jsã䜿ã£ãŠç°¡åãªç·åœ¢ååž°ãå®è¡ããåºæ¬çãªäŸã以äžã«ç€ºããŸãïŒ
// TensorFlow.jsãã€ã³ããŒã
import * as tf from '@tensorflow/tfjs';
// ç·åœ¢ååž°ã¢ãã«ãå®çŸ©
const model = tf.sequential();
model.add(tf.layers.dense({units: 1, inputShape: [1]}));
// ã¢ãã«ãã³ã³ãã€ã«
model.compile({loss: 'meanSquaredError', optimizer: 'sgd'});
// èšç·ŽããŒã¿ãæºå
const xs = tf.tensor2d([[1], [2], [3], [4]], [4, 1]);
const ys = tf.tensor2d([[2], [4], [6], [8]], [4, 1]);
// ã¢ãã«ãèšç·Ž
async function train() {
await model.fit(xs, ys, {epochs: 100});
console.log('èšç·Žå®äºïŒ');
}
// äºæž¬ãå®è¡
async function predict() {
await train();
const prediction = model.predict(tf.tensor2d([[5]], [1, 1]));
console.log(prediction.dataSync()); // åºå: [10.00000023841858]
}
predict();
ãã®ã³ãŒãã¹ããããã¯ãç°¡åãªTensorFlow.jsã¢ãã«ãäœæãèšç·Žã䜿çšããåºæ¬çãªæé ã瀺ããŠããŸããnpmãŸãã¯yarnã䜿çšããŠTensorFlow.jsã©ã€ãã©ãªãã€ã³ã¹ããŒã«ããå¿ èŠããããŸãïŒ
npm install @tensorflow/tfjs
# ãŸãã¯
yarn add @tensorflow/tfjs
èšç·Žæžã¿ã¢ãã«ã®å©çš
TensorFlow.jsã§ã¯ãèšç·Žæžã¿ã®ã¢ãã«ãããŒãããŠäœ¿çšããããšãã§ããŸããããã«ãããã¢ãã«ãäžããèšç·Žããå¿ èŠããªããããæéãšãªãœãŒã¹ãç¯çŽã§ããŸããå©çšå¯èœãªèšç·Žæžã¿ã¢ãã«ã«ã¯ä»¥äžã®ãããªãã®ããããŸãïŒ
- MobileNet: ç»ååé¡çšã®è»œéã¢ãã«ã
- Coco-SSD: ç©äœæ€åºçšã®ã¢ãã«ã
- PoseNet: å§¿å¢æšå®çšã®ã¢ãã«ã
èšç·Žæžã¿ã¢ãã«ã䜿çšããã«ã¯ãtf.loadLayersModel()
颿°ã䜿ã£ãŠããŒãããŸãã
// MobileNetã¢ãã«ãããŒã
const model = await tf.loadLayersModel('https://storage.googleapis.com/tfjs-models/tfjs/mobilenet_v1_0.25_224/model.json');
// ç»åãããŒã
const image = document.getElementById('image');
// ç»åãååŠç
const tfImage = tf.browser.fromPixels(image).toFloat();
const offset = tf.scalar(127.5);
const normalizedImage = tfImage.sub(offset).div(offset);
const batchedImage = normalizedImage.reshape([1, 224, 224, 3]);
// äºæž¬ãå®è¡
const prediction = await model.predict(batchedImage);
// æã確çã®é«ãäºæž¬ãååŸ
const values = prediction.dataSync();
const index = values.indexOf(Math.max(...values));
console.log(`äºæž¬: ${index}`);
èæ ®äºé ãšèª²é¡
ã¯ã©ã€ã¢ã³ããµã€ãæ©æ¢°åŠç¿ã«ã¯å€ãã®å©ç¹ããããŸããããã®éçãèªèããŠããããšãéèŠã§ãïŒ
- ãªãœãŒã¹ã®å¶çŽïŒãã©ãŠã¶ã¯ãµãŒããŒã«æ¯ã¹ãŠãªãœãŒã¹ãéãããŠããŸããè€éãªã¢ãã«ã¯å€§éã®åŠçèœåãšã¡ã¢ãªãå¿ èŠãšããå¯èœæ§ããããããã©ãŒãã³ã¹ãããããªãŒå¯¿åœã«åœ±é¿ãäžããããšããããŸãã
- ã¢ãã«ãµã€ãºïŒå€§ããªã¢ãã«ã¯WebããŒãžã®åæããŒãæéãå¢å ãããå¯èœæ§ããããŸããã¢ãã«ã®æé©åãéååæè¡ãã¢ãã«ãµã€ãºã®åæžã«åœ¹ç«ã¡ãŸãã
- ã»ãã¥ãªãã£äžã®æžå¿µïŒã¯ã©ã€ã¢ã³ããµã€ãã®ã³ãŒãã¯ãŠãŒã¶ãŒããèŠãããããæ¹ããããªããŒã¹ãšã³ãžãã¢ãªã³ã°ã«å¯ŸããŠè匱ã«ãªãå¯èœæ§ããããŸããã¢ãã«ã®æå·åãé£èªåæè¡ããããã®ãªã¹ã¯ã軜æžããã®ã«åœ¹ç«ã¡ãŸãã
- ãã©ãŠã¶ã®äºææ§ïŒç°ãªããã©ãŠã¶ãããã€ã¹éã§ã®äºææ§ã確ä¿ããŠãã ãããã¢ããªã±ãŒã·ã§ã³ãæåŸ éãã«åäœããããšãä¿èšŒããããã«ã培åºçã«ãã¹ããè¡ã£ãŠãã ããã
ã¯ã©ã€ã¢ã³ããµã€ãAIã®ãã¹ããã©ã¯ãã£ã¹
æé©ãªããã©ãŒãã³ã¹ãšãŠãŒã¶ãŒäœéšã確ä¿ããããã«ã以äžã®ãã¹ããã©ã¯ãã£ã¹ãæ€èšããŠãã ããïŒ
- ã¢ãã«ã®æé©åïŒéååããã«ãŒãã³ã°ãªã©ã®æè¡ã䜿çšããŠãã¢ãã«ã®ãµã€ãºãšè€éããåæžããŸãã
- é å»¶èªã¿èŸŒã¿ïŒåæããŒãæéãççž®ããããã«ãã¢ãã«ãå¿ èŠãªãšãã«ã®ã¿èªã¿èŸŒã¿ãŸãã
- Web WorkerïŒèšç®éã®å€ãã¿ã¹ã¯ãWeb Workerã§å®è¡ããã¡ã€ã³ã¹ã¬ããã®ããããã³ã°ãUIã®ããªãŒãºãé²ããŸãã
- ããã°ã¬ãã·ããšã³ãã³ã¹ã¡ã³ãïŒãã©ãŠã¶ãTensorFlow.jsãGPUã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ããµããŒãããŠããªãå Žåã§ãã¢ããªã±ãŒã·ã§ã³ãåäœããããã«èšèšããŸãã
- ãŠãŒã¶ãŒãžã®ãã£ãŒãããã¯ïŒã¢ãã«ã®èªã¿èŸŒã¿ãæšè«ã®é²æç¶æ³ã«ã€ããŠããŠãŒã¶ãŒã«æç¢ºãªãã£ãŒãããã¯ãæäŸããŸãã
JavaScriptæ©æ¢°åŠç¿ã®æªæ¥
JavaScriptæ©æ¢°åŠç¿ã®åéã¯æ¥éã«é²åããŠããã以äžã®ç¹ã§ç¶ç¶çãªé²æ©ãèŠãããŸãïŒ
- ããŒããŠã§ã¢ã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ïŒãã©ãŠã¶ã®GPUã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ãµããŒãã®ç¶ç¶çãªæ¹åã«ãããããã©ãŒãã³ã¹ã¯ããã«åäžããŸãã
- ã¢ãã«æé©åæè¡ïŒã¢ãã«ã®å§çž®ãšæé©åã®ããã®æ°ããæè¡ã«ãããããè€éãªã¢ãã«ãã¯ã©ã€ã¢ã³ãã«ãããã€ã§ããããã«ãªããŸãã
- ãšããžã³ã³ãã¥ãŒãã£ã³ã°ïŒã¯ã©ã€ã¢ã³ããµã€ãAIãšãšããžã³ã³ãã¥ãŒãã£ã³ã°ã®çµ±åã«ãããåæ£åæ©æ¢°åŠç¿ã®æ°ããªå¯èœæ§ãçãŸããŸãã
TensorFlow.jsã¯ãéçºè ã以åã¯äžå¯èœã ã£ã驿°çã§ã€ã³ããªãžã§ã³ããªWebã¢ããªã±ãŒã·ã§ã³ãäœæããããšãå¯èœã«ããŠããŸããæ©æ¢°åŠç¿ã®åããã©ãŠã¶ã«ããããããšã§ããŠãŒã¶ãŒäœéšããã©ã€ãã·ãŒããªãã©ã€ã³æ©èœã®æ°ããªå¯èœæ§ãåãéããŠããŸããæè¡ãé²åãç¶ããã«ã€ããŠãä»åŸæ°å¹Žéã§ããã«ãšããµã€ãã£ã³ã°ãªJavaScriptæ©æ¢°åŠç¿ã®å¿çšãèŠãããããšãæåŸ ãããŸãã
çµè«
TensorFlow.jsã¯ãæ©æ¢°åŠç¿ãçŽæ¥ãã©ãŠã¶ã«ããããããã®åŒ·åãªããŒã«ã§ããé å»¶ãæžããããã©ã€ãã·ãŒã匷åãããªãã©ã€ã³æ©èœãå¯èœã«ãããã®èœåã¯ãå¹ åºãã¢ããªã±ãŒã·ã§ã³ã«ãšã£ãŠé åçãªéžæè¢ãšãªã£ãŠããŸãããªãœãŒã¹ã®å¶çŽãã»ãã¥ãªãã£ãšãã£ã課é¡ã¯æ®ããŸãããããŒããŠã§ã¢ã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ãšã¢ãã«æé©åã«ãããç¶ç¶çãªé²æ©ããAIãWebäœéšã«ã·ãŒã ã¬ã¹ã«çµ±åãããæªæ¥ãžã®éãåãéããŠããŸããã¯ã©ã€ã¢ã³ããµã€ãAIã®ååãçè§£ããTensorFlow.jsã®èœåãæŽ»çšããããšã§ãéçºè ã¯Webã®æªæ¥ã圢äœãçã«é©æ°çã§é åçãªã¢ããªã±ãŒã·ã§ã³ãäœæããããšãã§ããŸãã
ããã«è©³ããïŒ