在深度學(xué)習(xí)中,我們通常會(huì)頻繁地對(duì)數(shù)據(jù)進(jìn)行操作??梢哉f,數(shù)據(jù)處理是深度學(xué)習(xí)的基礎(chǔ)。為了開始我們后續(xù)的工作,首先我們需要存儲(chǔ)和處理數(shù)。如果您之前使用過Python的科學(xué)計(jì)算包NumPy,那么您將會(huì)接下來的內(nèi)容非常熟悉。
在DJL的NDArray不僅支持CUP,還支持GPU以及分離式云端結(jié)構(gòu),并且支持自動(dòng)微分等功能。
>新手上路
新手上路,我們先用arange創(chuàng)建一個(gè)一個(gè)行向量x,包含從0開始連續(xù)的12個(gè)整數(shù)。
~~~java
NDManager manager = NDManager.newBaseManager();
NDArray x = manager.arange(12);
System.out.println(x);
~~~
輸出值為:
~~~java
ND: (12) cpu() int32
[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
~~~
這里我們將使用 NDManager來創(chuàng)建向量x。因?yàn)镴ava Garbage Collector無法監(jiān)管本地內(nèi)存消耗,我們需要NDManager來幫助管理NDArray的內(nèi)存消耗和回收。通常我們會(huì)把NDManager封裝在try blocks中,這樣所有的ndarray可以被及時(shí)關(guān)掉。如:
~~~java
try(NDManager manager = NDManager.newBaseManager()){
? NDArray x = manager.arange(12);
? System.out.println(x);
}
~~~
向量維度
我們可以通過查看shape屬性,獲得 NDArray 的shape維度信息(每個(gè)軸的長(zhǎng)度)。
~~~java
//查看維度信息
System.out.println(x.getShape());
~~~
~~~java
//輸出
(12)
~~~
當(dāng)然,我們也可以通過reshape功能手工調(diào)整,改變 NDArray 的維度并且不改變每個(gè)元素的數(shù)值。例如,我們可以這樣轉(zhuǎn)換我們的向量x,從維度(1, 12)的行向量轉(zhuǎn)化成維度為(3, 4)的矩陣。這是一個(gè)新的ndarray,包含相同的數(shù)值但是是由3行和4列寫成的。盡管shape維度改變了,但是向量x? 的成員沒有改變。
~~~java
//變更維度
x = x.reshape(3, 4);
System.out.println(x);
~~~
輸出:
~~~java
ND: (3, 4) cpu() int32
[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
]
~~~
簡(jiǎn)單總結(jié)
在剛開始動(dòng)手學(xué)習(xí)深度學(xué)習(xí)時(shí),是很痛苦的,因?yàn)橹癑ava開發(fā)者大腦里運(yùn)算的是數(shù)字計(jì)算。在數(shù)字計(jì)算轉(zhuǎn)換到向量計(jì)算時(shí),不但計(jì)算量會(huì)增加,思維模式也發(fā)生了很大的變化。本章通過簡(jiǎn)單的代碼帶您上手。通過簡(jiǎn)單的工具,為您準(zhǔn)備好基礎(chǔ)數(shù)學(xué)及計(jì)算知識(shí),盡量使您因不會(huì)數(shù)學(xué)概念而帶來的學(xué)習(xí)煩惱。