属性
基础¤
元素总数
¤
numel() -> sint
返回张量中的元素总数。
t = Tensor([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
print(t.numel())
8
Source code in tinygrad/tensor.py
3925 3926 3927 3928 3929 3930 3931 3932 3933 3934 | |
元素大小
¤
element_size() -> int
返回张量中单个元素的大小(以字节为单位)。
t = Tensor([5], dtype=dtypes.int16)
print(t.element_size())
2
Source code in tinygrad/tensor.py
3936 3937 3938 3939 3940 3941 3942 3943 3944 3945 | |
字节数
¤
nbytes() -> int
返回张量中所有元素的总字节数。
t = Tensor([8, 9], dtype=dtypes.float)
print(t.nbytes())
8
Source code in tinygrad/tensor.py
3947 3948 3949 3950 3951 3952 3953 3954 3955 3956 | |
是否为浮点类型
¤
is_floating_point() -> bool
如果张量包含浮点类型则返回True,即属于dtype.float64、dtype.float32、
dtype.float16或dtype.bfloat16之一。
t = Tensor([8, 9], dtype=dtypes.float32)
print(t.is_floating_point())
True
Source code in tinygrad/tensor.py
3958 3959 3960 3961 3962 3963 3964 3965 3966 3967 3968 | |
大小
¤
返回张量的大小。如果指定了dim,则返回沿维度dim的长度。否则返回张量的形状。
t = Tensor([[4, 5, 6], [7, 8, 9]])
print(t.size())
(2, 3)
print(t.size(dim=1))
3
Source code in tinygrad/tensor.py
3970 3971 3972 3973 3974 3975 3976 3977 3978 3979 3980 3981 3982 | |
数据访问¤
数据
¤
data() -> memoryview
返回该张量的数据作为内存视图。
t = Tensor([1, 2, 3, 4])
print(np.frombuffer(t.data(), dtype=np.int32))
[1 2 3 4]
Source code in tinygrad/tensor.py
293 294 295 296 297 298 299 300 301 302 303 304 | |
项目
¤
item() -> ConstType
返回该张量的值作为一个标准的Python数值。
t = Tensor(42)
print(t.item())
42
Source code in tinygrad/tensor.py
306 307 308 309 310 311 312 313 314 315 316 | |
转换为列表
¤
返回该张量的值作为一个嵌套列表。 对于常量张量则返回单个值。
t = Tensor([1, 2, 3, 4])
print(t.tolist())
[1, 2, 3, 4]
t = Tensor(5)
print(t.tolist())
5
Source code in tinygrad/tensor.py
320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 | |
numpy
¤
numpy() -> 'np.ndarray'
将此张量的值作为numpy.ndarray返回。
t = Tensor([1, 2, 3, 4])
print(repr(t.numpy()))
array([1, 2, 3, 4], dtype=int32)
Source code in tinygrad/tensor.py
336 337 338 339 340 341 342 343 344 345 346 347 348 349 | |
tinygrad 操作¤
schedule_with_vars
¤
创建实现这些带有变量的Tensor(s)所需的调度计划。
注意
一个张量只能被调度一次。
Source code in tinygrad/tensor.py
226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 | |
调度
¤
schedule(*lst: Tensor) -> list[ScheduleItem]
创建实现这些张量所需的调度计划。
Source code in tinygrad/tensor.py
247 248 249 250 251 | |
实现
¤
触发创建这些张量所需的计算。
Source code in tinygrad/tensor.py
253 254 255 256 | |
替换
¤
将该张量的数据替换为另一个张量的数据。仅要求张量的形状必须匹配。
Source code in tinygrad/tensor.py
258 259 260 261 262 263 264 265 | |
赋值
¤
assign(x) -> Tensor
Source code in tinygrad/tensor.py
267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 | |
分离
¤
detach() -> Tensor
返回一个与此张量数据相同的新张量,但已从自动微分图中分离。
Source code in tinygrad/tensor.py
284 285 286 287 288 | |
克隆
¤
clone() -> Tensor
创建一个该张量的克隆,为数据分配单独的缓冲区。
Source code in tinygrad/tensor.py
351 352 353 354 355 356 357 | |
至
¤
将张量移动到指定设备。
Source code in tinygrad/tensor.py
359 360 361 362 363 364 365 366 367 368 | |
转换为
¤
将张量原地移动到指定设备。
Source code in tinygrad/tensor.py
370 371 372 373 374 375 376 | |
分片
¤
将张量分片到给定的设备上。可选地指定要在哪个轴上进行分片。
t = Tensor.empty(2, 4)
print(t.shard((t.device, t.device), axis=1).lazydata)
UOp(Ops.MULTI, dtypes.float, arg=(1, (True, True)), src=(
UOp(Ops.CONTIGUOUS, dtypes.float, arg=None, src=(
UOp(Ops.COPY, dtypes.float, arg=False, src=(
x2:=UOp(Ops.DEVICE, dtypes.void, arg='CPU', src=()),
UOp(Ops.SHRINK, dtypes.float, arg=((0, 2), (0, 2)), src=(
x4:=UOp(Ops.RESHAPE, dtypes.float, arg=(2, 4), src=(
UOp(Ops.BUFFER, dtypes.float, arg=8, src=(
x2,
UOp(Ops.UNIQUE, dtypes.void, arg=1169, src=()),)),)),)),)),)),
UOp(Ops.CONTIGUOUS, dtypes.float, arg=None, src=(
UOp(Ops.COPY, dtypes.float, arg=False, src=(
x2,
UOp(Ops.SHRINK, dtypes.float, arg=((0, 2), (2, 4)), src=(
x4,)),)),)),))
Source code in tinygrad/tensor.py
378 379 380 381 382 383 384 385 386 387 388 389 390 | |
分片_
¤
将张量就地分片到给定的设备上。
Source code in tinygrad/tensor.py
392 393 394 395 396 | |
连续
¤
contiguous() -> Tensor
返回一个连续的张量。
Source code in tinygrad/tensor.py
2719 2720 2721 2722 2723 | |
contiguous_backward
¤
contiguous_backward() -> Tensor
在反向传播过程中插入一个连续操作。
Source code in tinygrad/tensor.py
2734 2735 2736 2737 2738 | |
梯度¤
梯度
¤
gradient(
*targets: Tensor,
gradient: Tensor | None = None,
materialize_grads=False
) -> list[Tensor]
计算目标相对于自身的梯度。
x = Tensor.eye(3)
y = Tensor([[2.0,0,-2.0]])
z = y.matmul(x).sum()
dx, dy = z.gradient(x, y)
print(dx.tolist()) # dz/dx
print(dy.tolist()) # dz/dy
[[2.0, 2.0, 2.0], [0.0, 0.0, 0.0], [-2.0, -2.0, -2.0]]
[[1.0, 1.0, 1.0]]
Source code in tinygrad/tensor.py
865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 | |
反向传播
¤
将张量的梯度通过计算图反向传播。 如果未提供'gradient'参数,则该张量必须是标量,且梯度隐式设置为1.0。
t = Tensor([1.0, 2.0, 3.0, 4.0], requires_grad=True)
t.sum().backward()
print(t.grad.numpy())
[1. 1. 1. 1.]
Source code in tinygrad/tensor.py
894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 | |