在浏览器中进行深度学习:TensorFlow.js (一)基本概念
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
作為deeplearn.js的繼任者,tensoflow.js?支持在瀏覽器或者nodejs中利用JavaScript來運(yùn)行深度學(xué)習(xí)。并且能夠支持GPU和現(xiàn)有的Tensorflow的模型。該項(xiàng)目的首頁上有幾個(gè)很酷炫的演示。作為熱愛機(jī)器學(xué)習(xí)和前端數(shù)據(jù)可視化的我怎能不心動(dòng)呢??靵砗臀乙黄饋砜纯慈绾卫胻ensorflow.js來進(jìn)行深度學(xué)習(xí)之旅吧。
線性代數(shù)(Linear algebra)是深度學(xué)習(xí)的數(shù)學(xué)基礎(chǔ)。張量(Tensor)是線性代數(shù)的基本數(shù)學(xué)概念和運(yùn)算單元。我們來了解一下tensorflow.js中有關(guān)張量的基本概念和運(yùn)算。
張量的概念
標(biāo)量 Scalar
標(biāo)量就是一個(gè)簡單的數(shù)字,概念就是只有大小,沒有方向。
const scalar = tf.scalar(5); print_tensor([scalar]);注意:print_tensor()是我實(shí)現(xiàn)的一個(gè)JS方法,在瀏覽器中以表格的形式顯示張量的內(nèi)容,最高兩個(gè)維度。輸入是一個(gè)張量的數(shù)組。如果不想在瀏覽器中看到結(jié)果,也可以調(diào)用tensor.print()方法,在console中查看張量的內(nèi)容。
以上的代碼,創(chuàng)建了一個(gè)數(shù)值為5,維度(Rank)0 的標(biāo)量。
向量/矢量 Vector
向量就是一個(gè)一維數(shù)組,概念就是有大小和方向。
const vector = tf.tensor1d([0, 1, 2, 3, 4]); print_tensor([vector]);以上的代碼,創(chuàng)建了一個(gè)數(shù)值為[0,1,2,3,4],維度?1?的向量。形狀(Shape)描述了各個(gè)維度的容量或者說大小,這里是5.
張量 Tensor
矩陣(Matrix)擁有兩個(gè)維度,在更高的維度,就是張量。其實(shí)所有的標(biāo)量,矢量,矩陣都可以用張量表示,只是維度不同。
在Tensoflow中Rank表示了維度的等級(jí),對(duì)應(yīng)如下
- 標(biāo)量 0? tf.scalar
- 矢量 1? ?tf.tensor1d
- 矩陣 2? tf.tensor2d
- 張量 2+ tf.tensor3d, tf.tensor4d
以上的代碼,創(chuàng)建了一個(gè)數(shù)值為[[1.0, 2.0, 3.0], [10.0, 20.0, 30.0]],維度 2?的矩陣。形狀是2X3,兩行,三列。
一張圖來直觀說明:
tensorflow.js提供了對(duì)張量的創(chuàng)建和生成,變形,切片和合并等方法,用于對(duì)數(shù)據(jù)的準(zhǔn)備。
張量的運(yùn)算
張量-標(biāo)量運(yùn)算
張量和標(biāo)量之間的數(shù)學(xué)運(yùn)算(加減乘除冪)比較簡單,只要直接把張量的每一個(gè)元素和標(biāo)量進(jìn)行對(duì)應(yīng)的數(shù)學(xué)運(yùn)算就好了。
const t = tf.tensor([[1.0, 2.0, 3.0], [10.0, 20.0, 30.0]]); const s = tf.scalar(3); print_tensor([t,s,t.add(s),t.mul(s)])張量和標(biāo)量的數(shù)學(xué)運(yùn)算不會(huì)改變張量的形狀,并且滿足算術(shù)運(yùn)算的基本定律,例如加法交換律,乘法結(jié)合律等等。
張量-張量加減乘
具有相同形狀的張量可以進(jìn)行加減操作。只要把對(duì)應(yīng)的元素做加減就好了。
const a = tf.tensor1d([1, 2, 3, 4]); const b = tf.tensor1d([10, 20, 30, 40]); print_tensor([a,b,a.add(b),a.sub(b),a.mul(b)])張量-張量 點(diǎn)積
張量的積 tensor.matMul() 在深度學(xué)習(xí)中被大量的應(yīng)用,下圖給出了一個(gè)矩陣點(diǎn)積的例子:
簡單說一個(gè)m*n的矩陣和一個(gè)n*k的矩陣的點(diǎn)積得到一個(gè)m*k的矩陣。
const a = tf.tensor2d([[1, 2], [3, 4]]); const b = tf.tensor2d([[5, 6, 7], [7, 8, 9]]); print_tensor([a, b, a.matMul(b)]);注意,矩陣的點(diǎn)積不滿足乘法交換律,AB != BA
const a = tf.tensor2d([[1, 2], [3, 4]]); const b = tf.tensor2d([[5, 6], [7, 8]]); print_tensor([a, b, a.matMul(b), b.matMul(a)]);矩陣轉(zhuǎn)置? (Transpose)
矩陣的轉(zhuǎn)置就是將矩陣的所有元素繞著一條從第1行第1列元素出發(fā)的右下方45度的射線作鏡面反轉(zhuǎn),即得到矩陣的轉(zhuǎn)置。
const a = tf.tensor2d([[1, 2], [3, 4],[5,6]]); print_tensor([a, a.transpose()]);單位矩陣(Identity Matrix)
就像數(shù)學(xué)中的1,任何數(shù)字和1相乘都是這個(gè)數(shù)本身。單位矩陣的特性就是任何矩陣和單位矩陣的點(diǎn)積的結(jié)果都是原矩陣本身。單位矩陣就是一個(gè)n*n的矩陣對(duì)角線上的元素都是1,其它為0。
利用tf.oneHot() 可以生成一個(gè)單位矩陣。
const identity = tf.oneHot(tf.tensor1d([0, 1, 2]), 3); print_tensor([identity]);我們以后再去研究利用tf.initializers.identity來初始化單位矩陣。
矩陣的逆? (Inverse)
如果一個(gè)矩陣和另一矩陣相乘得到單位矩陣,那么這個(gè)矩陣就是該矩陣的逆。
tensorflow 提供了矩陣的逆操作,tf.matrix_inverse
然而tensorflow.js中并沒有對(duì)應(yīng)的操作。(考慮到當(dāng)前的版本是0.6.1,我們就忍了。另外據(jù)說深度學(xué)習(xí)并沒有用到任何矩陣的逆操作。)
注意,并不是所有的矩陣都是可逆的,有些矩陣找不到逆矩陣。
進(jìn)一步了解矩陣的逆可以參考這篇文章
兩個(gè)矩陣的除法可以理解為一個(gè)矩陣和另一個(gè)矩陣的逆的點(diǎn)積。
Reduction
深度學(xué)習(xí)中常常需要對(duì)張量各個(gè)維度進(jìn)行統(tǒng)計(jì)。例如求均值,總和等等。tensorflow.js提供了相應(yīng)的操作。
const x = tf.tensor2d([[1, 2, 3],[4,5,6]]); print_tensor([x, x.mean(),x.max(),x.min(), x.sum()]);這里給出了一個(gè)矩陣的所有元素的均值,最大值,最小值和總和,也可以針對(duì)行和列做相應(yīng)的操作。
下面的代碼對(duì)于每一列做相應(yīng)的統(tǒng)計(jì)。
const x = tf.tensor2d([[1, 2, 3],[4,5,6]]); print_tensor([x, x.mean(0),x.max(0),x.min(0), x.sum(0)]);除了上面提到的操作,tensorflow.js還提供了:
- 基本的數(shù)學(xué)運(yùn)算諸如三角函數(shù),對(duì)數(shù),開方等
- 邏輯操作
- ... ...
總結(jié)
本文描述了張量的基本概念和操作,并給出了tensorflow.js中的代碼例子。線性代數(shù)作為機(jī)器學(xué)習(xí),尤其是深度學(xué)習(xí)的數(shù)學(xué)基礎(chǔ),值得大家去了解和掌握。
本文中所有的代碼示例大家都可以在我的codepen中運(yùn)行。
參考
- Tensor PlayGround
- 可汗學(xué)院線性代數(shù)
- Beginner Tensorflowjs Examples in Javascript?
- Tensorflow.js官網(wǎng)
- Tensorflow.js代碼
- 11 Javascript Machine Learning Libraries To Use In Your?App
轉(zhuǎn)載于:https://my.oschina.net/taogang/blog/1790365
總結(jié)
以上是生活随笔為你收集整理的在浏览器中进行深度学习:TensorFlow.js (一)基本概念的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SVN 使用方法
- 下一篇: Firefox浏览器中,input输入框