å¼ é(Tensor)¶
+æ¯ä¸ªTensorå®ä¾é½æ¯ä¸ä¸ªåé å¨ç¹å®Deviceå®ä¾ä¸çå¤ç»´æ°ç»ã Tensorå®ä¾åå¨äºåé并æä¾äºç¨æ·ä¸å¯è§çæ¯æå¤ç§è®¾å¤ç代æ°æä½ã注æï¼ç¨æ·éè¦ç¡®ä¿é¤äºæ·è´ä¹å¤çtensoræä½é½æ¯å¨ç¸åç设å¤ä¸è¿è¡çã
+Tensorçå®ç°
+SINGAæä¸ç§Tensorå½æ°çå®ç°ï¼åå«å¨ä¸å设å¤ä¸ã
+-
+
tensor_math_cpp.h
ç¨Cppå®ç°äºCppCPUä¸çåç§æä½
+tensor_math_cuda.h
ç¨Cuda (åcuBLAS)å®ç°äºCudaGPUä¸çåç§æä½
+tensor_math_opencl.h
ç¨OpenCLå®ç°äºOpenclGPUä¸çåç§æä½
+
PYTHON API¶
+ç¨æ³ç¤ºä¾ï¼
+import numpy as np
+from singa import tensor
+from singa import device
+
+# create a tensor with shape (2,3), default CppCPU device and float32
+x = tensor.Tensor((2, 3))
+x.set_value(0.4)
+
+# create a tensor from a numpy array
+npy = np.zeros((3, 3), dtype=np.float32)
+y = tensor.from_numpy(npy)
+
+y.uniform(-1, 1) # sample values from the uniform distribution
+
+z = tensor.mult(x, y) # gemm -> z of shape (2, 3)
+
+x += z # element-wise addition
+
+dev = device.get_default_device()
+x.to_device(dev) # move the data to a gpu device
+
+r = tensor.relu(x)
+
+s = tensor.to_numpy(r) # tensor -> numpy array
+
æ两ç§ç±»åçtensorå½æ°:
+Tensoræåå½æ°
+å°ä¼æ¹åTensorå®ä¾çç¶æ
+Tensor模ååå½æ°
+æ¥åTensorå®ä¾ä½ä¸ºèªåé以åè¿åTensorå®ä¾
+æ¯ä¸ªTensorå®ä¾å¨è¯»åæ°æ®åé½å¿ é¡»ååå§å
++
class singa.tensor.Tensor(shape=None, device=None, dtype=0)¶
+å建Py Tensorï¼å°è£ äºä¸ä¸ªåºäºswig转æ¢çCPP Tensorã +ä¸ä¸ªåæ°åå«æ¯Tensorçä¸ä¸ªå±æ§ã
+åæ°ï¼
+-
+
- shape (list
) â ä¸ä¸ªå表çæ´å½¢æ°æ®ä½ä¸ºTensorçå½¢ç¶ãå¦æshape没ææå®ï¼å°ä¼å建ä¸ä¸ªä¼ªTensorã
+ - device â swig转åç使ç¨è®¾å¤æ¨¡ååçDeviceå®ä¾ã å¦æ为Noneï¼é»è®¤çCPU设å¤å°ä¼è¢«ä½¿ç¨ã +
- dtype â æ°æ®ç±»åã ç®åï¼å¤§å¤æ°æä½ä» æ¯ækFloat32ã +
+
T()¶
+æµ æ·è´ã
+è¿åå¼ï¼ ä¸ä¸ªæ°Tensorï¼å ±äº«åºå±æ°æ®æå å åï¼ä½æ 记为该tensorç转置çæ¬ã
++
add_column(v)¶
+对该Tensoræ¯åå ä¸ä¸ä¸ªtensorã
+åæ°ï¼
+-
+
- v (Tensor) â 被ä½ä¸ºä¸åå å°åtensorçTensor +
+
add_row(v)¶
+对该tensoræ¯è¡å ä¸ä¸ªtensorã
+åæ°ï¼
+-
+
- v (Tensor) â 被ä½ä¸ºè¡å å°åtensorçTensor +
+
bernoulli(p)¶
+对æ¯ä¸ªå ç´ ï¼æç §ç»å®æ¦çä»0/1ä¸åæ ·ã
+åæ°ï¼
+-
+
- p (float) â 以æ¦çpåæ ·ä¸ä¸ªå ç´ ä¸º1 +
+
clone()¶
+è¿åå¼ï¼ ä¸ä¸ªæ°Tensorï¼æ¯å¾ æ·è´Tensorçæ·±æ·è´
++
copy()¶
+è°ç¨singa::Tensorçæ·è´æé å¨è¿è¡æµ æ·è´ã
++ +
+
copy_from_numpy(np_array, offset=0)¶
+ä»numpyæ°ç»ä¸æ·è´æ°æ®ã
+åæ°ï¼
+-
+
- np_array â æºnumpyæ°ç» +
- offset (int) â ç®æ å移 +
+ +
+
div_column(v)¶
+å°Tensoræ¯åé¤ä»¥vã
+åæ°ï¼
+-
+
- v (Tensor) â 1ç»´tensorï¼åæºtensorçåé¿ç¸å +
+
div_row(v)¶
+å°Tensoræ¯è¡é¤ä»¥vã
+åæ°ï¼
+-
+
- v (Tensor) â 1ç»´tensorï¼åæºtensorçè¡é¿ç¸å +
+
gaussian(mean, std)¶
+æç §é«æ¯åå¸å¯¹æ¯ä¸ªå ç´ éæ ·ã
+åæ°ï¼
+-
+
- mean (float) â åå¸çåå¼ +
- std (float) â åå¸çæ åå·® +
+
is_empty()¶
+è¿åå¼ï¼ æ ¹æ®tensorçå½¢ç¶ï¼å¦ææ¯ç©ºçè¿åTrue
++
is_transpose()¶
+è¿åå¼ï¼ å¦æå é¨æ°æ®è¢«è½¬ç½®åè¿åTrueï¼å¦åè¿åFalse
++
l1()¶
+è¿åå¼ï¼ L1 norm
++
l2()¶
+è¿åå¼ï¼ L2 norm
++
memsize()¶
+-
+
- è¿åå¼ï¼ 被åé ç»è¯¥tensorçBytesæ° +
+
mult_column(v)¶
+å°tensoræ¯ååvåå ç´ çº§å«ä¹æ³ã
+åæ°ï¼
+-
+
- v (Tensor) â 1ç»´tensorï¼åæºtensoråé¿çé¿ +
+
mult_row(v)¶
+å°tensoræ¯è¡åvåå ç´ çº§å«ä¹æ³ã
+åæ°ï¼
+-
+
- v (Tensor) â 1ç»´tensorï¼åæºtensorè¡é¿çé¿ +
+
ndim()¶
+è¿åå¼ï¼ tensorç维度
++
reset_like(t)¶
+æ ¹æ®ç»å®tensoréç½®æºtensorå½¢ç¶ï¼æ°æ®ç±»åå设å¤ã
+åæ°ï¼
+-
+
- t (Tensor) â éè¦éç½®çtensor +
+ +
+
size()¶
+è¿åå¼ï¼ tensorä¸çå ç´ ä¸ªæ°
++
to_device(device)¶
+å°tensorä¸æ°æ®ä¼ å°æå®è®¾å¤ä¸ã
+åæ°ï¼
+-
+
- device - ä»CudaGPU/CppCPU/OpenclGPU转æ¢çswigè®¾å¤ +
+
to_host()¶
+å°tensoræ°æ®ä¼ å°é»è®¤çCppCPU设å¤ä¸ã
++
uniform(low, high)¶
+ä»åååå¸ä¸è¿è¡éæ ·ã
+åæ°ï¼
+-
+
- low (float) â ä¸ç +
- high (float) â ä¸ç +
+
singa.tensor.abs(t)¶
+åæ°ï¼
+-
+
- t(Tensor) - è¾å ¥tensor +
è¿åå¼ï¼ ä¸ä¸ªæ°tensorï¼å ¶å ç´ å¼ä¸ºy=abs(x)ï¼xæ¯tä¸çå ç´
++
singa.tensor.add(lhs, rhs, ret=None)¶
+å ç´ çº§å«å æ³ã
+åæ°ï¼
+-
+
- lhs (Tensor) â å·¦æä½tensor +
- rhs (Tensor) â å³æä½tensor +
- ret (Tensor, optional) â å¦æä¸æ¯ç©ºï¼ ç»æå°è¢«ä¿åå¨å ¶ä¸ï¼å¦åï¼ä¸ä¸ªæ°tensorä¼è¢«å建以ä¿åç»æã +
è¿åå¼ï¼ æ°tensor
++
singa.tensor.add_column(alpha, v, beta, M)¶
+å°vå å°Mçæ¯ä¸ªååé, å®ä¹Mä¸å为mï¼m=alpha * v + beta * m
+åæ°ï¼
+-
+
- alpha (float) â vçç³»æ° +
- v (Tensor) â 1ç»´tensor +
- beta (float) â Mçç³»æ° +
- M (Tensor) â 2ç»´tensor +
è¿åå¼ï¼ M
++
singa.tensor.add_row(alpha, v, beta, M)¶
+å°vå å°Mçæ¯ä¸ªè¡åé, å®ä¹Mä¸è¡ä¸ºmï¼m=alpha * v + beta * mã
+åæ°ï¼
+-
+
- alpha (float) â vçç³»æ° +
- v (Tensor) â 1ç»´tensor +
- beta (float) â Mçç³»æ° +
- M (Tensor) â 2ç»´tensor +
è¿åå¼ï¼ M
++
singa.tensor.average(t, axis=None)¶
+åæ°ï¼
+-
+
- t (Tensor) â è¾å ¥Tensor +
- axis (int, optional) â å¦æ为空ï¼åææå ç´ çå¹³åå¼ï¼å¦åï¼åç»å®ç»´åº¦çå ç´ å¹³åå¼ã0表示ååå¼ï¼1表示è¡åå¼ã +
è¿åå¼ï¼ å¦æaxisæ¯ç©ºï¼è¿åä¸ä¸ªfloatå¼ï¼å¦åï¼è¿åä¸ä¸ªæ°tensor
++
singa.tensor.axpy(alpha, x, y)¶
+å ç´ çº§å«æä½ y += alpha * xã
+åæ°ï¼
+-
+
- alpha (float) â xçç³»æ° +
- x (Tensor) â 被å çtensor +
- y (Tensor) â åtensor +
è¿åå¼ï¼ y
++
singa.tensor.bernoulli(p, t)¶
+对æ¯ä¸ªå ç´ çæä¸ä¸ªäºè¿å¶ä½ã
+åæ°ï¼
+-
+
- p (float) â each element is 1 with probability p; and 0 with 1 - p +
- t (Tensor) â the results are put into t +
è¿åå¼ï¼ t
++
singa.tensor.copy_data_to_from(dst, src, size, dst_offset=0, src_offset=0)¶
+å°æ°æ®ä»ä¸ä¸ªtensorå®ä¾æ·è´å°å¦ä¸ä¸ªtensorå®ä¾ã
+åæ°ï¼
+-
+
- dst (Tensor) â ç®æ Tensor +
- src (Tensor) â æºTensor +
- size (int) â æ·è´å ç´ æ°ç® +
- dst_offset (int) â æ·è´å°dstå ç´ å¨dstçèµ·å§å移 +
- src_offset (int) â å¾ æ·è´çå ç´ å¨srcä¸çèµ·å§å移 +
+
singa.tensor.div(lhs, rhs, ret=None)¶
+å ç´ çº§å«çé¤æ³ã
+åæ°ï¼
+-
+
- lhs (Tensor) â å·¦æä½tensor +
- rhs (Tensor) â å³æä½tensor +
- ret (Tensor, optional) â å¦æé空ï¼å°æç»æåå ¥ï¼å¦åï¼å建ä¸ä¸ªæ°tensor并å°ç»æåå ¥ +
è¿åå¼ï¼ åæè¿ç®ç»æçtensor
++
singa.tensor.eltwise_mult(lhs, rhs, ret=None)¶
+å ç´ çº§å«çä¹æ³ã
+åæ°ï¼
+-
+
- lhs (Tensor) â å·¦æä½tensor +
- rhs (Tensor) â å³æä½tensor +
- ret (Tensor, optional) â å¦æé空ï¼å°æç»æåå ¥ï¼å¦åï¼å建ä¸ä¸ªæ°tensor并å°ç»æåå ¥ +
è¿åå¼ï¼ ä¿åè¿ç®ç»æçtensor
++
singa.tensor.exp(t)¶
+åæ°ï¼
+-
+
- t (Tensor) â è¾å ¥tensor +
è¿åå¼ï¼ æ°tensorï¼å ¶ä¸å ç´ ä¸º y = exp(x)ï¼x为tä¸å ç´
++
singa.tensor.from_numpy(np_array)¶
+æ ¹æ®numpyæ°ç»çå½¢ç¶ãæ°æ®ç±»ååæ°å¼å建ä¸ä¸ªtensorã
+åæ°ï¼
+-
+
- np_array â numpyæ°ç» +
è¿åå¼ï¼ åé å¨é»è®¤CppCPU设å¤ä¸çtensorå®ä¾
++
singa.tensor.gaussian(mean, std, t)¶
+æç §ç»å®é«æ¯åå¸çææ°å¼ã
+åæ°ï¼
+-
+
- mean (float) â é«æ¯åå¸çåå¼ +
- std (float) â é«æ¯åå¸çæ åå·® +
- t (Tensor) â ç»æ被åå ¥t +
è¿åå¼ï¼ t
++
singa.tensor.ge(t, x)¶
+å ç´ çº§å«çæ¯è¾ï¼t >= xã
+åæ°ï¼
+-
+
- t (Tensor) â å·¦æä½æ° +
- x (Tensor or float) â å³æä½æ° +
è¿åå¼ï¼ 0.0f æ t[i] >= x[i] ? 1.0f:0.0f
+è¿åå¼ç±»åï¼ tensorï¼æ¯ä¸ªå ç´ ä¸º t[i] >= x ? 1.0f
++
singa.tensor.gt(t, x)¶
+å ç´ çº§å«çæ¯è¾ï¼t > xã
+åæ°ï¼
+-
+
- t (Tensor) â å·¦æä½tensor +
- x (Tensor or float) â å³æä½tensorææ° +
è¿åå¼ï¼ 0.0f æ t[i] > x[i] ? 1.0f:0.0f
+è¿åå¼ç±»åï¼ tensorï¼æ¯ä¸ªå ç´ ä¸º t[i] > x ? 1.0f
++
singa.tensor.le(t, x)¶
+å ç´ çº§å«çæ¯è¾ï¼t <= xã
+åæ°ï¼
+-
+
- t (Tensor) â å·¦æä½tensor +
- x (Tensor or float) â å³æä½tensorææ° +
è¿åå¼ï¼ 0.0f æ t[i] <= x[i] ? 1.0f:0.0f
+è¿åå¼ç±»åï¼ tensorï¼æ¯ä¸ªå ç´ ä¸º t[i] <= x ? 1.0f
++
singa.tensor.lt(t, x)¶
+å ç´ çº§å«çæ¯è¾ï¼t < xã
+åæ°ï¼
+-
+
- t (Tensor) â å·¦æä½tensor +
- x (Tensor or float) â å³æä½tensorææ° +
è¿åå¼ï¼ 0.0f æ t[i] < x[i] ? 1.0f:0.0f
+è¿åå¼ç±»åï¼ tensorï¼æ¯ä¸ªå ç´ ä¸º t[i] < x ? 1.0f
++
singa.tensor.log(t)¶
+åæ°ï¼
+-
+
- t (Tensor) â è¾å ¥tensor +
è¿åå¼ï¼ ä¸ä¸ªæ°tensorï¼å ¶å ç´ å¼ä¸ºy = log(x)ï¼xæ¯tä¸çå ç´
++
singa.tensor.mult(A, B, C=None, alpha=1.0, beta=0.0)¶
+ç©éµ-ç©éµæç©éµ-åéä¹æ³, å½æ°è¿å C = alpha * A * B + beta * Cã
+åæ°ï¼
+-
+
- A (Tensor) â 2ç»´Tensor +
- B (Tensor) â å¦æBæ¯1ç»´Tensor, å°è°ç¨GEMVåç©éµ-åéä¹æ³ï¼å¦åå°è°ç¨GEMMã +
- C (Tensor, optional) â åå¨ç»æï¼å¦æ为空ï¼å°å建æ°tensoråå¨ç»æã +
- alpha (float) â A * B çç³»æ° +
- beta (float) â C çç³»æ° +
è¿åå¼ï¼ ä¿åè¿ç®ç»æçtensor
++
singa.tensor.pow(t, x, out=None)¶
+åæ°ï¼
+-
+
- t (Tensor) â è¾å ¥tensor +
- x (float or Tensor) â å¦æxæ¯æµ®ç¹æ° y[i] = t[i]^x; å¦å y[i]= t[i]^x[i] +
- out (None or Tensor) â å¦æé空ï¼å°åå ¥ç»æï¼å¦åï¼å°å建ä¸ä¸ªæ°tensorä¿åç»æã +
è¿åå¼ï¼ ä¿åè¿ç®ç»æçtensor
++
singa.tensor.relu(t)¶
+åæ°ï¼
+-
+
- t (Tensor) â è¾å ¥tensor +
è¿åå¼ï¼ tensorï¼å ¶ä¸å ç´ ä¸º y = x è¥x >0ï¼å¦åy = 0ï¼x为tä¸å ç´
++
singa.tensor.reshape(t, s)¶
+æ¹åtensorçå½¢ç¶ã
+åæ°ï¼
+-
+
- t (Tensor) â å¾ æ¹åå½¢ç¶çtensor +
- s (list
) â æ°å½¢ç¶ï¼ä½ç§¯ååtensorä½ç§¯ç¸å
+
è¿åå¼ï¼ æ°tensor
++
singa.tensor.sigmoid(t)¶
+åæ°ï¼
+-
+
- t (Tensor) â è¾å ¥tensor +
è¿åå¼ï¼ tensorï¼å ¶ä¸å ç´ ä¸º y = sigmoid(x)ï¼x为tä¸å ç´
++
singa.tensor.sign(t)¶
+åæ°ï¼
+-
+
- t (Tensor) â è¾å ¥tensor +
è¿åå¼ï¼ tensorï¼å ¶ä¸å ç´ ä¸º y = sign(x)ï¼x为tä¸å ç´
++
singa.tensor.sizeof(dtype)¶
+è¿åå¼ï¼ ä¾æ®core.protoä¸å®ä¹çSINGAæ°æ®ç±»åï¼è¿åç»å®ç±»åæå Byteæ°ç®
++
singa.tensor.softmax(t, out=None)¶
+对tensoræ¯è¡åSoftMaxã
+åæ°ï¼
+-
+
- t (Tensor) â è¾å ¥1ç»´æ2ç»´tensor +
- out (Tensor, å¯é) â å¦æé空ï¼å°åå ¥ç»æ +
è¿åå¼ï¼ ä¿åæä½ç»æçtensor
++
singa.tensor.sqrt(t)¶
+åæ°ï¼
+-
+
- t (Tensor) â è¾å ¥tensor +
è¿åå¼ï¼ tensorï¼å ¶ä¸å ç´ ä¸º y = sqrt(x)ï¼x为tä¸å ç´
++
singa.tensor.square(t)¶
+åæ°ï¼
+-
+
- t (Tensor) â è¾å ¥tensor +
è¿åå¼ï¼ tensorï¼å ¶ä¸å ç´ ä¸º y = x * xï¼x为tä¸å ç´
++
singa.tensor.sub(lhs, rhs, ret=None)¶
+å ç´ çº§å«çåæ³ã
+åæ°ï¼
+-
+
- lhs (Tensor) â å·¦æä½tensor +
- rhs (Tensor) â å³æä½tensor +
- ret (Tensor, å¯é) â å¦æé空ï¼å°åå ¥ç»æï¼å¦åï¼å°å建ä¸ä¸ªæ°tensorä¿å +
è¿åå¼ï¼ åæ¾ç»æçtensor
++
singa.tensor.sum(t, axis=None)¶
+å¨ç»å®ç维度ä¸æ±åã
+åæ°ï¼
+-
+
- t (Tensor) â è¾å ¥Tensor +
- axis (int, å¯é) â å¦æ为空ï¼å°å¯¹ææå ç´ æ±åï¼å¦æç»å®æ°å¼ï¼å°æ²¿ç»å®ç»´åº¦æ±åï¼æ¯å¦ï¼0 - æåæ±åï¼1 - æè¡æ±åã +
è¿åå¼ï¼ å¦ææ¯å¯¹æ´ä½æ±åï¼è¿åä¸ä¸ªæµ®ç¹æ°ï¼å¦åè¿åtensor
++
singa.tensor.sum_columns(M)¶
+æåæ±åã
+åæ°ï¼
+-
+
- M (Tensor) â è¾å ¥ç2ç»´tensor +
è¿åå¼ï¼ 产çæ±åç»æçtensor
++
singa.tensor.sum_rows(M)¶
+æè¡æ±åã
+åæ°ï¼
+-
+
- M (Tensor) â è¾å ¥ç2ç»´tensor +
è¿åå¼ï¼ 产çæ±åç»æçtensor
++
singa.tensor.tanh(t)¶
+åæ°ï¼
+-
+
- t (Tensor) â è¾å ¥tensor +
è¿åå¼ï¼tensorï¼å ¶ä¸å ç´ ä¸º y = tanh(x)ï¼x为tä¸å ç´
++
singa.tensor.to_host(t)¶
+å°æ°æ®æ·è´å°host设å¤ä¸ã
++
singa.tensor.to_numpy(t)¶
+æ·è´tensoræ°æ®å°numpyæ°ç»ã
+åæ°ï¼
+-
+
- t (Tensor) â è¾å ¥tensor +
è¿åå¼ï¼ numpyæ°ç»
++
singa.tensor.uniform(low, high, t)¶
+æç §åååå¸çææ°å¼ã
+åæ°ï¼
+-
+
- low (float) â ä¸ç +
- hight (float) â ä¸å± +
- t (Tensor) â ç»æåå ¥t +
è¿åå¼ï¼ t
++