±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚÍøÂ磬ȫÎÄ´Ó¼¼ÊõÁĵ½²úÆ·µÄÍæ·¨£¬Éè¼ÆÊ¦£¯²úÆ·¾ÀíÖ»Óж®µÃ¼¼ÊõµÄÐÂÌØÐÔ£¬²ÅÄÜΪ²úÆ·ÈÚÈëеÄÍæ·¨¡£
|
|
1 ¸ÅÄîÆª
1.1 tensors
TensorFlow.js °Ñ N άÊý×鶼ͳ³ÆÎª tensor £¬Îª·½±ãÀí½â£¬¼ûÏÂͼ¡£

¶¯ÊÖʵ¼ùÏ´úÂ룺
var
shape=[2,3];
var a=tf.tensor([1,2,3,4,4,5],shape);
a.print() |
Ò²¿ÉÒÔ¸ÄдΪ£º
var
a=tf.tensor([[1,2,3],[4,4,5]]);
a.print() |
»¹¿ÉÒÔд³É tf.scalar£¬ tf.tensor1d £¬ tf.tensor2d £¬ tf.tensor3d
ºÍ tf.tensor4d£¬ÒÔÌá¸ß´úÂëµÄ¿É¶ÁÐÔ¡£
var
a=tf.scalar(4);
a.print();
var b=tf.tensor1d([0,2,3,4]);
b.print();
var c=tf.tensor2d([[0,3],[4,5]]);
c.print(); |
TensorFlow.js»¹ÌṩÁËÖ±½Ó´´½¨ËùÓÐֵΪ0»òÕß1µÄÕÅÁ¿£¨
tensor £©£¬ÊµÑéÏ£º
tf.zeros([10]).print();
tf.zeros([2,8]).print();
tf.zeros([2,2,3]).print();
tf.ones([10]).print();
tf.ones([2,8]).print();
tf.ones([2,2,3]).print(); |
1.2 Variables
Tensors ÊDz»¿É±äµÄ£¬Ò»µ©´´½¨£¬²»ÄܸıäÆäÖµ£»¶ø variables
Ôò¿ÉÒÔ¶¯Ì¬¸Ä±äÆäÖµ£¬Ö÷ÒªÓÃÓÚÔÚÄ£ÐÍѵÁ·ÆÚ¼ä´æ´¢ºÍ¸üÐÂÖµ¡£
var
initalValues=tf.ones([8]);
initalValues.print();
//biases±äÁ¿£¬Í¨¹ýassign·½·¨¸üÐÂÆäÖµ
var biases=tf.variable(initalValues);
biases.print();
var updatedValues=tf.tensor1d([0,1,2,3,4,5,6,7]);
updatedValues.print();
biases.assign(updatedValues);
biases.print(); |
1.3 Operations ( Ops )
һЩÊýѧµÄÔËË㣬¾ØÕó±ä»»£¬¾í»ý²Ù×÷£¬Âß¼²Ù×÷µÈ¡£¹Ù·½ api ÎĵµºÜÆëÈ«£¬Ð´µÃºÜÇå³þ£¨
https://js.tensorflow.org/api/0.6.1/ £©£¬ÏÂÃæÁ·Ï°Ï square
ºÍ add £º
//square
var d=tf.tensor2d([[1,2,3],[4,5,6]]);
d.print();
var d_squared=d.square();
d_squared.print();
//add
var a=tf.tensor2d([[1,2,3],[4,5,6]]);
var b=tf.tensor2d([[3,1,9],[14,25,16]]);
a.print();
b.print();
var c=a.add(b);
c.print();
d.add(b).square().print(); |
1.4 Models and Layers
Models Ï൱ÓÚ JS º¯ÊýµÄ¸ÅÄ¸ø¶¨Ò»Ð©ÊäÈ룬ʹÓà Ops À´±íʾģÐÍËù×öµÄ¹¤×÷£¬²úÉúһЩÆÚÍûµÄÊä³ö¡£
TensorFLow.js ÓÐ 2 ÖÖ´´½¨Ä£Ð͵ķ½·¨¡£
//
¶¨ÒåÒ»¸ö predict º¯Êý
function predict(input) {
// ʵÏÖÒ»¸öÊýѧº¯ÊýµÄ¼ÆËã y = a * x ^ 2 + b * x + c
return tf.tidy(() => {
const x = tf.scalar(input);
const ax2 = a.mul(x.square());
const bx = b.mul(x);
const y = ax2.add(bx).add(c);
return y;
});
}
// ¶¨Òå³£Á¿
var a = tf.scalar(2),
b = tf.scalar(4),
c = tf.scalar(8);
// ²âÊÔÏ predict º¯Êý
predict(1999993).print(); |
ÓÉÓÚ TensorFlow.js ÊÇʹÓà GPU À´ÔËËãµÄ£¬ËùÒÔÐèÒª¹ÜÀí GPU µÄÄڴ棬µ±Ê¹Óà tensors
ºÍ variables ʱ¡£ÆäÖУ¬ tf.tidy µÄ·½·¨ÓÐÖúÓÚ±ÜÃâÄÚ´æÐ¹Â©£¨±ÜÃâ³ÌÐò±ÀÀ££©£¬ÊÔÏÂ
tidy £º
//
y = 3 ^ 2 + 1
var y = tf.tidy(() => {
// a, b, ÒÔ¼° one ½«»á±»Çå¿Õµ± tidy ½áÊøÊ±¡£
const one = tf.scalar(1);
const a = tf.scalar(3);
const b = a.square();
console.log('tensors µÄÊýÁ¿ (in tidy): ' + tf.memory().numTensors);
return b.add(one);
});
console.log('tensors µÄÊýÁ¿ (outside tidy): '
+ tf.memory().numTensors);
y.print(); |
³ýÁË tidy Í⣬»¹ÓÐ dispose ¿ÉÒÔÓÃÀ´ÊÖ¶¯¹ÜÀí GPU ÄÚ´æ¡£ÊÔÑéÏ£º
const
x=tf.tensor2d([[0,2,3],[1,2,3]]);
const x_squared=x.square();
x.print();
x_squared.print();
console.log(tf.memory().numTensors);
x.dispose();
console.log(tf.memory().numTensors);
x_squared.dispose();
console.log(tf.memory().numTensors); |
tensorFlow.js »¹ÄÚÖÃÁËһЩ model µÄ³éÏ󣬿ÉÒÔʹÓÃ
tf.model À´¹¹ÔìÒ»¸ö²»º¬ layer µÄÄ£ÐÍ¡£ tf °üº¬µÄ layer ÓÐ tf.layers.simpleRNN
£¬ tf.layers.gru ºÍ tf.layers.lstm µÈ¡£ÕâÀïµÃͨ¹ý¼¸¸öСÐÍÏîÄ¿À´Êµ¼ùÁË¡£
2 ¹Ù·½Ê¾Àý
ÎÒÃÇ¿ÉÒÔÏÂÔØ¹Ù·½Ê¾Àý£¬ÔÚ±¾µØÔËÐв鿴Ч¹û¡£¹Ù·½ tensorFlow.js
ÏîÄ¿£¬Ê¹Óà yarn ×÷Ϊ°ü¹ÜÀí¹¤¾ß£¬Ê¹Óà Parcel ×÷Ϊ Web Ó¦ÓõĴò°ü¹¤¾ß¡£
ÈçºÎʹÓùٷ½Ê¾Àý£¬Ö»Òª½âѹºó£¬½øÈëÏîĿĿ¼£¬ÖÕ¶ËÊäÈë yarn £¬°²×°ÍêÒÀÀµ°üºóÔÙÊäÈë yarn
watch ¼´¿ÉÔËÐÐÏîÄ¿¡£
¹ÙÍøÓм¸¸öʾÀý£¬µÚÒ»¸ö¼òµ¥µÄÊÇ´ÓÍ·¿ªÊ¼¹¹½¨Ò»¸öСÐ͵ÄÄ£ÐÍ£¬ÓÃÓÚÄâºÏÇúÏß¡£µÚ¶þ¸öʾ·¶ÁË
CNN ʶ±ðÊÖдÊý×Ö¡£µÚÈý¸öʹÓÃÁËÇ¨ÒÆÑ§Ï°£¬ÑµÁ·Ò»¸öÉñ¾ÍøÂçÀ´Ô¤²âÉãÏñÍ·µÄÊý¾Ý¡£µÚËĸö½éÉÜÈçºÎ½« Keras
»ò TensorFlow ѵÁ·ºÃµÄÄ£Ð͵¼Èë TensorFlow.js À´Ê¹Óá£ÓÐÐËȤ¿ÉÒÔÏêϸѧϰÏ¡£
3 webcam-transfer-learning

ÆäÖйٷ½µÄÓÎϷʾÀý webcam-transfer-learning £¬½¨ÒéÍæÒ»Íæ£¬ÊÇ»ùÓÚ MobileNet
µÄÒ»¸öÇ¨ÒÆÑ§Ï°µÄÀý×Ó¡£
3.1 MobileNet
MobileNets:
Efficient Convolutional Neural Networks for
Mobile Vision Applications |
ÕâÊǹȸèµÄһƪÂÛÎÄÌá³öµÄ£¬¿ÉÒÔ¼«´óµÄѹËõÄ£ÐÍÎļþ´óС£¬·Ç³£ÊʺÏÒÆ¶¯¶ËʹÓᣱ¾ÎÄʹÓà Keras ԤѵÁ·µÄͼÏñ·ÖÀàÄ£ÐÍ
MobileNet_25_224 ¡£Í¨¹ý¼ÓÔØÑµÁ·ºÃµÄ keras Ä£ÐÍ£¬¿ÉÒÔÖ±½ÓÔÚä¯ÀÀÆ÷ʹÓûòÔÙ´ÎÔÚä¯ÀÀÆ÷ÖÐʹÓÃÇ¨ÒÆÑ§Ï°£¬ÑµÁ·ÐµÄÄ£ÐÍ¡£
ÏÈÏÂÔØÑµÁ·ºÃµÄÄ£ÐÍ£º
https://github.com/fchollet/deep-learning-models/releases/download/v0.6/mobilenet_2_5_224_tf.h5 |
È»ºóÖÕ¶ËÔËÐУº
È»ºóÔËÐУº
tensorflowjs_converter
--input_format keras mobilenet_2_5_224_tf.h5
model |
ת³É tensorFlow.js ¿Éµ÷ÓÃµÄ model ºó£¬ÎÒÃÇÐèÒª°Ñ model ·ÅÖÃÔÚÒ»¸ö·þÎñÆ÷ÉÏ£¬²¢ÉèÖÃÔÊÐí¿çÓòÇëÇó£¬Õâ±ß¿ÉÒÔʹÓÃÒ»¸ö
nodejs µÄ¿â£º
npm
install http-server -g |
½øÈëmodelÎļþ¼ÐÄÚÔËÐУº
http-server
-p 3000 --cors |
¼ÓÔØ model ¿ÉÒÔʹÓãº
const
model = await tf.loadModel(¡®https://localhost:3000/model.json'); |
¹Ù·½Ò²ºÜÌùÐĵİÑÄ£Ðͷŵ½ https://storage.googleapis.com/tfjs-models/tfjs/mobilenet_v1_0.25_224/model.json
¹©µ÷ÓÃÁË¡£
ÕâÀïÎÒ²âÊÔÁËÏ MobileNet µÄЧ¹û£º

3.2 Transfer Learning
webcam-transfer-learning ÊÇÒ»¸öͼÏñ·ÖÀàÎÊÌ⣬½«ÉãÏñÍ·ÅÄÉãµÄÕÕÆ¬ÓëÉÏÏÂ×óÓҵ͝×÷×ö¹ØÁª¡£Ö÷ÒªÊÇѵÁ·Êý¾ÝÊÕ¼¯£ºÉãÏñÍ·ÅÄÉ㣬ÿÕÅͼƬ¹éÒ»»¯´¦Àí³É
shape Ϊ [1,244,244,3] µÄÕÅÁ¿£¬×÷ΪѵÁ·Êý¾Ý£»Îª´Ë tensorFlow.js
ÌØµØ·â×°Á˵÷Óà webcam µÄÏà¹Ø·½·¨£¬ÒÔ·½±ãÖ±½Ó¶Ô½Óµ½ tensorFLow.js ÖÐʹÓᣲ¢Ê¹ÓÃ
Transfer Learning Ç¨ÒÆÑ§Ï°À´¼õÉÙѵÁ·Êý¾ÝµÄÁ¿£¬´ïµ½·ÖÀàµÄÄ¿µÄ¡£

3.2.1 Ô¤´¦Àí
¼ÓÔØÔ¤ÑµÁ·Ä£ÐÍ MoblieNet £¬²¢½ØÈ¡ºÏÊʵIJã×÷ΪÊä³ö¡£ÉÏÎÄÒѾ½éÉܹýÈçºÎ°Ñ keras ѵÁ·µÄÄ£ÐÍת³É
tensorFlow.js µÄÄ£Ð͸ñʽÁË£¬ÕâÀïÎÒÃÇÖ±½Ó´Ó¹È¸èÌṩµÄÄ£ÐÍ·þÎñÖлñÈ¡¡£
´úÂ룺
async
function loadMobilenet() {
const mobilenet = await tf.loadModel(
'https://storage.googleapis.com/tfjs-models/tfjs/mobilenet_v1_0.25_224/model.json');
console.log(mobilenet.layers)
const layer = mobilenet.getLayer(¡®conv_pw_13_relu');
console.log(layer.output.shape)
return tf.model({
inputs: mobilenet.inputs,
outputs: layer.output
});
} |
ͨ¹ýµ÷Óà getLayer(¡®conv_pw_13_relu¡¯) £¬ÎÒÃǽøÈëÁËԤѵÁ·µÄ MobileNet
Ä£Ð͵ÄÄÚ²¿²ã£¬²¢¹¹½¨ÁËÒ»¸öеÄÄ£ÐÍ£¬ÆäÖÐÊäÈëÊÇÓë MobileNet ÏàͬµÄÊäÈ룬µ«Êä³öµÄÊÇ MobileNet
Öмä²ãÃûΪ conv_pw_13_relu µÄ²ã¡£ÎÒÃÇÆ¾¾ÑéÑ¡ÔñÁËÕâÒ»²ã£¨ Ëü¶ÔÎÒÃǵÄÈÎÎñºÜÓÐЧ £©¡£Ò»°ãÀ´Ëµ£¬½Ó½üԤѵÁ·Ä£ÐͽáÊøµÄ²ã½«ÔÚ´«ÊäѧϰÈÎÎñÖбíÏÖ¸üºÃ£¬ÒòΪËü°üº¬ÊäÈëµÄ¸ü¸ß¼¶ÓïÒåÌØÕ÷¡£³¢ÊÔÑ¡ÔñÁíÒ»¸öͼ²ã£¬¿´¿´ËüÊÇÈçºÎÓ°ÏìÄ£ÐÍÖÊÁ¿µÄ£¡¿ÉÒÔʹÓÃ
model.layers ´òÓ¡Ä£Ð͵Äͼ²ã²é¿´¡£
ÔÚ´úÂëÖмÓÈ룺
console.log(layer.output.shape) |
´òÓ¡³öÀ´ÊÇ [ null , 7 , 7 , 256 ] £¬Ã¿´ÎÓû§ÅÄÉãÕÕÆ¬£¬¶¼»áÂíÉϵ÷Óà MobileNet
Êä³ö conv_pw_13_relu ²ã£¬×÷Ϊ Model µÄÊäÈëÊý¾Ý£¨ÉÏͼµÄºìÉ«¿ò£©¡£
3.2.2 Ç¨ÒÆÑ§Ï°
ÎÒÃǽ«°Ñ MobileNet µÄÕâÒ»²ãÊä³ö×÷ΪÎÒÃÇд´½¨µÄÄ£Ð͵ÄÊäÈ룬д´½¨µÄÄ£ÐÍÊä³öΪ 4 ¸öÀà±ðµÄÔ¤²â¡££¨ÉÏͼµÄºìÉ«¿ò£©
model
= tf.sequential({
layers: [
tf.layers.flatten({
inputShape: [7, 7, 256]
}),
tf.layers.dense({
units: ui.getDenseUnits(),
activation: 'relu',
kernelInitializer: 'varianceScaling',
useBias: true
}),
tf.layers.dense({
units: NUM_CLASSES,
kernelInitializer: 'varianceScaling',
useBias: false,
activation: 'softmax'
})
]
}); |
´´½¨2¸öÈ«Á¬½Ó²ãµÄÄ£ÐÍ£¬¶ÀÁ¢ÓÚ mobilenet Ä£ÐÍ¡£¸ù¾ÝÓû§ÅÄÉãµÄ4¸öͼƬ£¬ÑµÁ·´ËÐÂÄ£ÐÍ¡£
ÕâÀïʹÓÃÁË tf.layers.flatten ¡£¹ØÓÚ tf.layers.flatten µÄʹÓ㬿ÉÒÔʵ¼ùÏ£º
model=tf.sequential();
model.add(tf.layers.flatten({inputShape:[12,4]}));
nn=model.predict(tf.ones([99,12,4]));
console.log(nn.shape);
nn.print() |
ÊäÈëÊÇÒ»¸öshape Ϊ[99,12,4]µÄÈýάÕÅÁ¿£¬×îºóÊä³öµÄÊÇÒ»¸öshape Ϊ [99, 48]
µÄ¶þάÕÅÁ¿£¬flatten °Ñ [12 , 4] £¬Ñ¹ËõΪ [ 12X4 ] ¡£
4 »ùÓÚÓû§¸öÐÔ»¯Êý¾ÝµÄ²úÆ·
webcam-transfer-learning ÓÎÏ·¸øÎÒÃÇÌṩÁËÒ»¸ö»ùÓÚÓû§¸öÐÔ»¯Êý¾ÝµÄÍæ·¨¡£Óû§¿ÉÒԷdz£µÍ³É±¾µÄѵÁ·ÊôÓÚ×Ô¼ºµÄͼÏñ·ÖÀàÄ£ÐÍ£¬ÓÃÓÚ¸÷ÖÖ·ÖÀàÎÊÌâ¡£ÎÒÃÇ¿ÉÒÔÍØÕ¹Ï£¬±ÈÈçʶ±ðÓû§µÄÊÖÊÆ¶¯×÷£¬À´¿ØÖÆÓÎÏ·ÖеÄÈËÎʶ±ðÓû§µÄ±íÇ飬¿ØÖÆ3dÈËÎïµÄ±íÇ飻ʶ±ðͼÏñÖеÄÈËÁ³ÊýÁ¿£¬×Ô¶¯Òþ²ØËùä¯ÀÀµÄÄÚÈÝ£¬·ÀÖ¹±»¿úÊÓ¡¡ÉõÖÁ
autodraw ¡¢ui2code ¡¢ÊÖд×Öʶ±ðµÈÕâЩӦÓö¼¿ÉÒÔ³¢ÊÔÈÚÈëÓû§¸öÐÔ»¯µÄÊý¾ÝÔÙѵÁ·µÄÍæ·¨£¬¸øÓèÓû§ÕÆ¿ØÈ¨¡£
ÎÒÈÏΪм¼Êõ¶¼»áÓÐÒ»ÖÖºÜ×ÔÈ»µÄеĽ»»¥·½Ê½Óë֮ƥÅä¡£»ùÓÚä¯ÀÀÆ÷µÄÓû§¸öÐÔ»¯Êý¾ÝÔÙѵÁ·£¬¿ÉÒÔÌáÁ¶³öÒÔÏ»ù±¾µÄ½»»¥Á÷³Ì£º
É趨Àà±ð
¡ª> ²É¼¯Êý¾Ý
¡ª> ¿ªÊ¼ÑµÁ·
¡ª> ʹÓÃÓû§Êý¾Ý
¡ª> ºËÐŦÄÜ
¡ª> Íê³ÉÈÎÎñ£¯µÃµ½Ä³¸ö½á¹û¡£
Óû§Ê¹ÓÃ×Ô¼ºµÄÊý¾Ý£¬Ó¦Óøü·ûºÏÓû§¸öÐÔ»¯ÌØÕ÷£¬ÊÇÒ»ÖÖ²»Í¬ÓÚ¸öÐÔ»¯ÍƼöµÄ¡°¸öÐÔ»¯¡±²úÆ·Éè¼Æ·½·¨¡£
|