复杂运算
Reduce¤
求和
¤
sum(
axis: int | Sequence[int] | None = None,
keepdim=False,
dtype: DTypeLike | None = None,
) -> Tensor
返回张量沿指定轴或多个轴的元素之和。
你可以传入 axis 和 keepdim 关键字参数来控制计算最大值的轴以及是否保留被缩减的维度。
你可以传入dtype关键字参数来控制累加的数据类型。
如果未指定,则根据输入张量的数据类型选择累加数据类型。
t = Tensor.arange(6).reshape(2, 3)
print(t.numpy())
[[0 1 2]
[3 4 5]]
print(t.sum().numpy())
15
print(t.sum(axis=0).numpy())
[3 5 7]
print(t.sum(axis=1).numpy())
[ 3 12]
Source code in tinygrad/tensor.py
1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 | |
乘积
¤
prod(
axis: int | Sequence[int] | None = None,
keepdim=False,
dtype: DTypeLike | None = None,
) -> Tensor
返回张量沿指定轴或多个轴元素的乘积。
你可以传入axis和keepdim关键字参数来控制计算最大值的轴以及是否保留缩减后的维度。
你可以传入dtype关键字参数来控制累加的数据类型。
如果未指定,则根据输入张量的数据类型选择累加数据类型。
t = Tensor([-1, -2, -3, 1, 2, 3]).reshape(2, 3)
print(t.numpy())
[[-1 -2 -3]
[ 1 2 3]]
print(t.prod().numpy())
-36
print(t.prod(axis=0).numpy())
[-1 -4 -9]
print(t.prod(axis=1).numpy())
[-6 6]
Source code in tinygrad/tensor.py
1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 | |
最大值
¤
返回张量沿指定轴或多个轴的最大值。
你可以传入axis和keepdim关键字参数来控制计算最大值的轴以及是否保留缩减后的维度。
t = Tensor([[1, 0, 2], [5, 4, 3]])
print(t.numpy())
[[1 0 2]
[5 4 3]]
print(t.max().numpy())
5
print(t.max(axis=0).numpy())
[5 4 3]
print(t.max(axis=1, keepdim=True).numpy())
[[2]
[5]]
Source code in tinygrad/tensor.py
1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 | |
最小值
¤
返回张量沿指定轴或多个轴的最小值。
你可以传入 axis 和 keepdim 关键字参数来控制计算最小值的轴以及是否保留被缩减的维度。
t = Tensor([[1, 0, 2], [5, 4, 3]])
print(t.numpy())
[[1 0 2]
[5 4 3]]
print(t.min().numpy())
0
print(t.min(axis=0).numpy())
[1 0 2]
print(t.min(axis=1, keepdim=True).numpy())
[[0]
[3]]
Source code in tinygrad/tensor.py
1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 | |
任意
¤
测试在指定轴或轴上是否有任何元素求值为True。
你可以传入 axis 和 keepdim 关键字参数来控制归约轴以及是否保留被归约的维度。
t = Tensor([[True, True], [True, False], [False, False]])
print(t.numpy())
[[ True True]
[ True False]
[False False]]
print(t.any().numpy())
True
print(t.any(axis=0).numpy())
[ True True]
print(t.any(axis=1, keepdim=True).numpy())
[[ True]
[ True]
[False]]
Source code in tinygrad/tensor.py
1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 | |
全部
¤
测试是否所有元素沿指定轴或轴评估为True。
你可以传入 axis 和 keepdim 关键字参数来控制归约轴以及是否保留被归约的维度。
t = Tensor([[True, True], [True, False], [False, False]])
print(t.numpy())
[[ True True]
[ True False]
[False False]]
print(t.all().numpy())
False
print(t.all(axis=0).numpy())
[False False]
print(t.all(axis=1, keepdim=True).numpy())
[[ True]
[False]
[False]]
Source code in tinygrad/tensor.py
1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 | |
isclose
¤
返回一个新的张量,其中包含元素级比较结果,判断是否在容差范围内接近other。
rtol 和 atol 关键字参数控制比较的相对容差和绝对容差。
默认情况下,两个NaN值彼此不接近。如果equal_nan为True,则两个NaN值会被视为接近。
print(Tensor([1e-7, 1e-8, 1e-9, float('nan')]).isclose(Tensor([0.0, 0.0, 0.0, float('nan')])).numpy())
[False True True False]
print(Tensor([float('nan')]).isclose(Tensor([float('nan')]), equal_nan=True).numpy())
[ True]
Source code in tinygrad/tensor.py
1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 | |
平均值
¤
返回张量沿指定轴或轴的平均值。
你可以传入axis和keepdim关键字参数来控制计算均值的轴以及是否保留被缩减的维度。
Tensor.manual_seed(42)
t = Tensor.normal(2, 3, mean=2.5, std=0.5)
print(t.numpy())
[[2.9889 2.7339 2.7763]
[2.3356 2.0722 2.6376]]
print(t.mean().numpy())
2.5907671
print(t.mean(axis=0).numpy())
[2.6623 2.4031 2.707 ]
print(t.mean(axis=1).numpy())
[2.833 2.3485]
Source code in tinygrad/tensor.py
1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 | |
变量
¤
返回张量沿指定轴或轴方向的方差。
你可以传入axis、keepdim和correction关键字参数来控制计算方差的轴方向、是否保留缩减后的维度以及是否应用贝塞尔校正。
Tensor.manual_seed(42)
t = Tensor.normal(2, 3, mean=2.5, std=0.5)
print(t.numpy())
[[2.9889 2.7339 2.7763]
[2.3356 2.0722 2.6376]]
print(t.var().numpy())
0.109925404
print(t.var(axis=0).numpy())
[0.2134 0.2189 0.0096]
print(t.var(axis=1).numpy())
[0.0187 0.08 ]
Source code in tinygrad/tensor.py
1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 | |
var_mean
¤
var_mean(
axis: int | Sequence[int] | None = None,
keepdim=False,
correction=1,
) -> tuple[Tensor, Tensor]
计算指定维度dim上的方差和均值。
这是对Tensor.var和Tensor.mean的语法糖封装,以匹配torch.var_mean的功能。
Tensor.manual_seed(42)
t = Tensor.normal(2, 3, mean=2.5, std=0.5)
print(t.numpy())
[[2.9889 2.7339 2.7763]
[2.3356 2.0722 2.6376]]
var, mean = t.var_mean()
print(var.numpy(), mean.numpy())
0.109925404 2.5907671
Source code in tinygrad/tensor.py
1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 | |
标准
¤
返回张量沿指定轴或轴的标准差。
你可以传入axis、keepdim和correction关键字参数来控制计算标准差时所沿的轴、是否保留缩减后的维度以及是否应用贝塞尔校正。
Tensor.manual_seed(42)
t = Tensor.normal(2, 3, mean=2.5, std=0.5)
print(t.numpy())
[[2.9889 2.7339 2.7763]
[2.3356 2.0722 2.6376]]
print(t.std().numpy())
0.33155
print(t.std(axis=0).numpy())
[0.462 0.4679 0.0981]
print(t.std(axis=1).numpy())
[0.1367 0.2829]
Source code in tinygrad/tensor.py
1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 | |
标准差均值
¤
std_mean(
axis: int | Sequence[int] | None = None,
keepdim=False,
correction=1,
) -> tuple[Tensor, Tensor]
计算指定维度dim上的标准差和平均值。
这是对Tensor.std和Tensor.mean的语法糖封装,以匹配torch.std_mean的功能。
Tensor.manual_seed(42)
t = Tensor.normal(2, 3, mean=2.5, std=0.5)
print(t.numpy())
[[2.9889 2.7339 2.7763]
[2.3356 2.0722 2.6376]]
std, mean = t.std_mean()
print(std.numpy(), mean.numpy())
0.33155 2.5907671
Source code in tinygrad/tensor.py
1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 | |
softmax
¤
softmax(axis=-1, dtype: DTypeLike | None = None) -> Tensor
将softmax函数应用于张量沿指定轴。
将张量的元素重新缩放,使其位于[0, 1]范围内且总和为1。
你可以传入axis关键字参数来控制softmax计算所沿的轴。
Tensor.manual_seed(42)
t = Tensor.randn(2, 3)
print(t.numpy())
[[ 0.9779 0.4678 0.5526]
[-0.3288 -0.8555 0.2753]]
print(t.softmaxSource code in tinygrad/tensor.py
1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 | |
log_softmax
¤
log_softmax(
axis=-1, dtype: DTypeLike | None = None
) -> Tensor
将log-softmax函数应用于张量沿指定轴。
log-softmax函数是log空间中softmax函数在数值计算上更稳定的替代方案。
你可以传入axis关键字参数来控制计算log-softmax的轴。
Tensor.manual_seed(42)
t = Tensor.randn(2, 3)
print(t.numpy())
[[ 0.9779 0.4678 0.5526]
[-0.3288 -0.8555 0.2753]]
print(t.log_softmax().numpy())
[[-0.8127 -1.3228 -1.238 ]
[-1.2297 -1.7564 -0.6256]]
print(t.log_softmax(axis=0).numpy())
[[-0.2396 -0.2361 -0.564 ]
[-1.5463 -1.5594 -0.8414]]
Source code in tinygrad/tensor.py
1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 | |
logsumexp
¤
logsumexp(axis=None, keepdim=False) -> Tensor
计算张量沿指定轴或多个轴的对数求和指数。
log-sum-exp函数是一种数值稳定的方法,用于计算指数和对数的总和。
你可以传入axis和keepdim关键字参数来控制计算log-sum-exp的轴以及是否保留被缩减的维度。
Tensor.manual_seed(42)
t = Tensor.randn(2, 3)
print(t.numpy())
[[ 0.9779 0.4678 0.5526]
[-0.3288 -0.8555 0.2753]]
print(t.logsumexp().numpy())
2.1347282
print(t.logsumexp(axis=0).numpy())
[1.2174 0.7039 1.1167]
print(t.logsumexp(axis=1).numpy())
[1.7906 0.9009]
Source code in tinygrad/tensor.py
1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 | |
logcumsumexp
¤
logcumsumexp(axis=0) -> Tensor
计算张量沿指定轴或多个轴的对数累积求和指数。
log-cumsum-exp函数是一种数值稳定的方法,用于计算指数累积和的对数。
你可以传入axis关键字参数来控制计算log-cum-sum-exp的轴。
Tensor.manual_seed(42)
t = Tensor.randn(2, 3)
print(t.numpy())
[[ 0.9779 0.4678 0.5526]
[-0.3288 -0.8555 0.2753]]
print(t.logcumsumexp().numpy())
[[0.9779 0.4678 0.5526]
[1.2174 0.7039 1.1167]]
print(t.logcumsumexp(axis=0).numpy())
[[0.9779 0.4678 0.5526]
[1.2174 0.7039 1.1167]]
print(t.logcumsumexp(axis=1).numpy())
[[ 0.9779 1.4481 1.7906]
[-0.3288 0.1353 0.9009]]
Source code in tinygrad/tensor.py
1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 | |
argmax
¤
argmax(axis=None, keepdim=False) -> Tensor
返回张量沿指定轴的最大值的索引。
你可以传入axis和keepdim关键字参数来控制计算最大值的轴以及是否保留缩减后的维度。
t = Tensor([[1, 0, 2], [5, 4, 3]])
print(t.numpy())
[[1 0 2]
[5 4 3]]
print(t.argmax().numpy()) # 返回展平张量中最大值的索引。
3
print(t.argmax(axis=0).numpy()) # 返回沿轴0的最大值索引。
[1 1 1]
print(t.argmax(axis=1).numpy()) # 返回沿轴1的最大值索引。
[2 0]
Source code in tinygrad/tensor.py
1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 | |
argmin
¤
argmin(axis=None, keepdim=False) -> Tensor
返回张量沿指定轴的最小值的索引。
你可以传入 axis 和 keepdim 关键字参数来控制计算最小值的轴以及是否保留被缩减的维度。
t = Tensor([[1, 0, 2], [5, 4, 3]])
print(t.numpy())
[[1 0 2]
[5 4 3]]
print(t.argmin().numpy()) # 返回展平张量中最小值的索引。
1
print(t.argmin(axis=0).numpy()) # 返回沿轴0方向的最小值索引。
[0 0 0]
print(t.argmin(axis=1).numpy()) # 返回沿轴1方向的最小值索引。
[1 2]
Source code in tinygrad/tensor.py
1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 | |
处理¤
avg_pool2d
¤
avg_pool2d(
kernel_size: tuple[int, ...] = (2, 2),
stride=None,
dilation=1,
padding: int | tuple[int, ...] = 0,
ceil_mode=False,
count_include_pad=True,
) -> Tensor
对张量应用平均池化。
该函数支持三种不同类型的 padding
-
int(单值): 对所有空间维度统一应用相同的填充值。 -
tuple[int, ...](长度 = 空间维度数量): 为每个空间维度指定不同的填充值,格式为(padding_height, padding_width, ...)。 -
tuple[int, ...](长度 = 2 * 空间维度数): 以(padding_left, padding_right, padding_top, padding_bottom, ...)的形式为每个空间维度的每侧指定显式填充。
当ceil_mode设置为True时,输出形状将使用向上取整除法确定。
当count_include_pad设置为False时,零填充将不会包含在平均计算中。
注意
与PyTorch不同,这个实现不仅限于2D池化,而是适用于任意数量的维度。
参见:https://paperswithcode.com/method/average-pooling
t = Tensor.arange(25).reshape(1, 1, 5, 5)
print(t.avg_pool2d().numpy())
[[[[ 3. 5.]
[13. 15.]]]]
print(t.avg_pool2d(ceil_mode=True).numpy())
[[[[ 3. 5. 6.5]
[13. 15. 16.5]
[20.5 22.5 24. ]]]]
print(t.avg_pool2d(padding=1).numpy())
[[[[ 0. 0.75 1.75]
[ 3.75 9. 11. ]
[ 8.75 19. 21. ]]]]
print(t.avg_pool2d(padding=1, count_include_pad=False).numpy())
[[[[ 0. 1.5 3.5]
[ 7.5 9. 11. ]
[17.5 19. 21. ]]]]
Source code in tinygrad/tensor.py
2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 | |
max_pool2d
¤
max_pool2d(
kernel_size: tuple[int, ...] = (2, 2),
stride=None,
dilation=1,
padding: int | tuple[int, ...] = 0,
ceil_mode=False,
return_indices=False,
) -> Tensor | tuple[Tensor, Tensor]
对张量应用最大池化操作。
该函数支持三种不同类型的 padding
-
int(单值): 对所有空间维度应用相同的填充值。 -
tuple[int, ...](长度 = 空间维度数量): 以(padding_height, padding_width, ...)的形式为每个空间维度指定不同的填充值。 -
tuple[int, ...](长度 = 2 * 空间维度数): 以(padding_left, padding_right, padding_top, padding_bottom, ...)的形式为每个空间维度的每侧指定显式填充。
当ceil_mode设置为True时,输出形状将使用向上取整除法确定。
当return_indices设置为True时,将返回最大值及其对应的索引。
注意
与PyTorch不同,这个实现不仅限于2D池化,而是适用于任意数量的维度。
参见:https://paperswithcode.com/method/max-pooling
t = Tensor.arange(25).reshape(1, 1, 5, 5)
print(t.max_pool2d().numpy())
[[[[ 6 8]
[16 18]]]]
print(t.max_pool2d(ceil_mode=True).numpy())
[[[[ 6 8 9]
[16 18 19]
[21 23 24]]]]
print(t.max_pool2d(padding=1).numpy())
[[[[ 0 2 4]
[10 12 14]
[20 22 24]]]]
Source code in tinygrad/tensor.py
2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 | |
max_unpool2d
¤
max_unpool2d(
indices: Tensor,
kernel_size: tuple[int, ...] = (2, 2),
stride=None,
dilation=1,
padding: int | tuple[int, ...] = 0,
output_size=None,
)
使用来自argmax的索引执行max_pool2d的部分逆操作。
当提供output_size时,输出形状将明确匹配所给定的形状。
注意
与PyTorch不同,这个实现不仅限于2D池化,而是适用于任意数量的维度。
t = Tensor.arange(1, 17).reshape(1, 1, 4, 4)
print(t.numpy())
[[[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]
[13 14 15 16]]]]
output, indices = Tensor.max_pool2d(t, return_indices=True)
print(output.numpy())
print(indices.numpy())
[[[[ 6 8]
[14 16]]]]
[[[[ 5 7]
[13 15]]]]
print(Tensor.max_unpool2d(output, indices).numpy())
[[[[ 0 0 0 0]
[ 0 6 0 8]
[ 0 0 0 0]
[ 0 14 0 16]]]]
Source code in tinygrad/tensor.py
2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 | |
卷积2d
¤
conv2d(
weight: Tensor,
bias: Tensor | None = None,
groups=1,
stride=1,
dilation=1,
padding: int | tuple[int, ...] = 0,
dtype: DTypeLike | None = None,
) -> Tensor
对张量应用卷积操作,使用给定的weight权重和可选的bias偏置。
该函数支持三种不同类型的 padding
-
int(单值): 对所有空间维度统一应用相同的填充值。 -
tuple[int, ...](长度 = 空间维度数): 以(padding_height, padding_width, ...)的形式为每个空间维度指定不同的填充值。 -
tuple[int, ...](长度 = 2 * 空间维度数): 以(padding_left, padding_right, padding_top, padding_bottom, ...)的形式为每个空间维度的每侧指定显式填充。
注意
与PyTorch不同,这个实现不仅限于2D卷积,而是适用于任意维度的卷积。
See: https://pytorch.org/docs/stable/generated/torch.nn.Conv2d.html
t = Tensor.arange(9).reshape(1, 1, 3, 3)
w = Tensor.ones(1, 1, 2, 2)
print(t.conv2d(w).numpy())
[[[[ 8. 12.]
[20. 24.]]]]
Source code in tinygrad/tensor.py
2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 | |
转置二维卷积
¤
conv_transpose2d(
weight: Tensor,
bias: Tensor | None = None,
groups=1,
stride=1,
dilation=1,
padding=0,
output_padding=0,
) -> Tensor
在张量上应用带有给定weight和可选bias的转置卷积。
该函数支持三种不同类型的 padding
-
int(单值): 对所有空间维度应用相同的填充值。 -
tuple[int, ...](长度 = 空间维度数): 以(padding_height, padding_width, ...)的形式为每个空间维度指定不同的填充值。 -
tuple[int, ...](长度 = 2 * 空间维度数): 以(padding_left, padding_right, padding_top, padding_bottom, ...)的形式指定每个空间维度各边的显式填充。
注意
与PyTorch不同,该实现不仅限于2D转置卷积,而是适用于任意维度的卷积。
See: https://pytorch.org/docs/stable/generated/torch.nn.ConvTranspose2d.html
t = Tensor.arange(9).reshape(1, 1, 3, 3)
w = Tensor.ones(1, 1, 2, 2)
print(t.conv_transpose2d(w).numpy())
[[[[ 0. 1. 3. 2.]
[ 3. 8. 12. 7.]
[ 9. 20. 24. 13.]
[ 6. 13. 15. 8.]]]]
Source code in tinygrad/tensor.py
2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 | |
点积
¤
在两个张量之间执行点积运算。
如果w是一维的,则是对self的最后一个轴和w进行求和乘积。
如果w是N维且N≥2,则是对self的最后一个轴和w的倒数第二个轴进行求和乘积。
你可以传入可选的 dtype 关键字参数来控制累加的数据类型。
a = Tensor([1, 2, 3])
b = Tensor([1, 1, 0])
print(a.dot(b).numpy())
3
a = Tensor([[1, 2], [3, 4]])
b = Tensor([[5, 6], [7, 8]])
print(a.dot(b).numpy())
[[19 22]
[43 50]]
Source code in tinygrad/tensor.py
2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 | |
矩阵乘法
¤
在两个张量之间执行矩阵乘法。
你可以传入reverse关键字参数来控制矩阵乘法的顺序。
你可以传入可选的dtype关键字参数来控制累加的数据类型。
a = Tensor([[1, 2], [3, 4]])
b = Tensor([[5, 6], [7, 8]])
print(a.matmul(b).numpy())
[[19 22]
[43 50]]
Source code in tinygrad/tensor.py
2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 | |
einsum
staticmethod
¤
einsum(
formula: str,
*operands: Tensor | Sequence[Tensor],
dtype: DTypeLike | None = None
) -> Tensor
根据基于爱因斯坦求和约定的公式,对输入张量的元素乘积进行求和。
See: https://pytorch.org/docs/stable/generated/torch.einsum.html
x = Tensor([[1, 2], [3, 4]])
y = Tensor([[5, 6], [7, 8]])
print(Tensor.einsum("ij,ij->", x, y).numpy())
70
Source code in tinygrad/tensor.py
2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 | |
累加和
¤
计算张量沿指定axis的累积和。
t = Tensor.ones(2, 3)
print(t.numpy())
[[1. 1. 1.]
[1. 1. 1.]]
print(t.cumsum(1).numpy())
[[1. 2. 3.]
[1. 2. 3.]]
Source code in tinygrad/tensor.py
2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 | |
cummax
¤
计算张量沿指定axis的累积最大值。
t = Tensor([0, 1, -1, 2, -2, 3, -3])
print(t.numpy())
[ 0 1 -1 2 -2 3 -3]
print(t.cummax(0).numpy())
[0 1 1 2 2 3 3]
Source code in tinygrad/tensor.py
2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 | |
triu
¤
返回张量的上三角部分,其他元素设置为0。
参数 diagonal 决定哪条对角线位于边界。diagonal = 0 表示主对角线。
正值 diagonal 表示主对角线之上,负值 diagonal 表示主对角线之下。
t = Tensor([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
print(t.numpy())
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
print(t.triu(diagonal=0).numpy())
[[ 1 2 3 4]
[ 0 6 7 8]
[ 0 0 11 12]]
print(t.triu(diagonal=1).numpy())
[[ 0 2 3 4]
[ 0 0 7 8]
[ 0 0 0 12]]
print(t.triu(diagonal=-1).numpy())
[[ 1 2 3 4]
[ 5 6 7 8]
[ 0 10 11 12]]
Source code in tinygrad/tensor.py
2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 | |
下三角矩阵
¤
返回张量的下三角部分,其他元素被设置为0。
参数 diagonal 决定了哪条对角线位于边界上。diagonal = 0 表示主对角线。
正值 diagonal 表示主对角线之上,负值 diagonal 表示主对角线之下。
t = Tensor([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
print(t.numpy())
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
print(t.tril(diagonal=0).numpy())
[[ 1 0 0 0]
[ 5 6 0 0]
[ 9 10 11 0]]
print(t.tril(diagonal=1).numpy())
[[ 1 2 0 0]
[ 5 6 7 0]
[ 9 10 11 12]]
print(t.tril(diagonal=-1).numpy())
[[ 0 0 0 0]
[ 5 0 0 0]
[ 9 10 0 0]]
Source code in tinygrad/tensor.py
2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 | |
插值
¤
对输入size进行下采样或上采样,接受0到N个批次维度。
插值算法通过mode参数选择,目前仅支持linear、nearest和nearest-exact模式。
要运行bilinear或trilinear插值,需要传入2D或3D尺寸参数。
t = Tensor([[1, 2, 3, 4], [21, 22, 23, 24], [41, 42, 43, 44]])
print(t.numpy())
[[ 1 2 3 4]
[21 22 23 24]
[41 42 43 44]]
print(t.interpolate(size=(2,3), mode="linear").numpy())
[[ 6 7 8]
[36 37 38]]
Source code in tinygrad/tensor.py
2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 | |
散点
¤
scatter(
dim: int,
index: Tensor,
src: Tensor | ConstType,
reduce: Literal["multiply", "add"] | None = None,
) -> Tensor
将src值沿着由dim指定的轴进行分散。
使用reduce应用add或multiply归约操作。
注意
要在张量 src 中使用 reduce 参数,请参阅 Tensor.scatter_reduce。
src = Tensor.arange(1, 11).reshape(2, 5)
print(src.numpy())
[[ 1 2 3 4 5]
[ 6 7 8 9 10]]
index = Tensor([[0, 1, 2, 0]])
print(Tensor.zeros(3, 5, dtype=src.dtype).scatter(0, index, src).numpy())
[[1 0 0 4 0]
[0 2 0 0 0]
[0 0 3 0 0]]
index = Tensor([[0, 1, 2], [0, 1, 4]])
print(Tensor.zeros(3, 5, dtype=src.dtype).scatter(1, index, src).numpy())
[[1 2 3 0 0]
[6 7 0 0 8]
[0 0 0 0 0]]
print(Tensor.full((2, 4), 2.0).scatter(1, Tensor([[2], [3]]), 1.23, reduce='multiply').numpy())
[[2. 2. 2.46 2. ]
[2. 2. 2. 2.46]]
print(Tensor.full((2, 4), 2.0).scatter(1, Tensor([[2], [3]]), 1.23, reduce='add').numpy())
[[2. 2. 3.23 2. ]
[2. 2. 2. 3.23]]
Source code in tinygrad/tensor.py
2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 | |
分散归约
¤
scatter_reduce(
dim: int,
index: Tensor,
src: Tensor,
reduce: Literal["sum", "prod", "mean", "amax", "amin"],
include_self: bool = True,
) -> Tensor
将src值沿着dim指定的轴进行分散。
使用reduce应用"sum"、"prod"、"mean"、"amax"或"amin"归约操作。
设置 include_self=False 以排除 self 张量中的值参与归约计算。
src = Tensor.arange(1, 11).cast(dtypes.float).reshape(2, 5)
print(src.numpy())
index = Tensor([[0, 0, 0, 0, 0], [0, 0, 0, 0, 0]])
print(index.numpy())
[[ 1. 2. 3. 4. 5.]
[ 6. 7. 8. 9. 10.]]
[[0 0 0 0 0]
[0 0 0 0 0]]
print(Tensor.ones(1, 5, dtype=src.dtype).scatter_reduce(0, index, src, reduce='sum').numpy())
[[ 8. 10. 12. 14. 16.]]
print(Tensor.ones(1, 5, dtype=src.dtype).scatter_reduce(0, index, src, reduce='prod').numpy())
[[ 6. 14. 24. 36. 50.]]
print(Tensor.ones(1, 5, dtype=src.dtype).scatter_reduce(0, index, src, reduce='mean', include_self=False).numpy())
[[3.5 4.5 5.5 6.5 7.5]]
print(Tensor([[-10, 20, 0, 5, 10]], dtype=src.dtype).scatter_reduce(0, index, src, reduce='amax').numpy())
[[ 6. 20. 8. 9. 10.]]
print(Tensor([[-10, 20, 0, 5, 10]], dtype=src.dtype).scatter_reduce(0, index, src, reduce='amin').numpy())
[[-10. 2. 0. 4. 5.]]
Source code in tinygrad/tensor.py
2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 | |
masked_select
¤
masked_select(mask)
根据布尔值mask从self中选择元素。
t = Tensor([[0, 1, 2], [3, 4, 5], [6, 7, 8]])
mask = Tensor([[True, False, True], [False, True, False], [False, False, True]])
print(t.numpy())
print(mask.numpy())
[[0 1 2]
[3 4 5]
[6 7 8]]
[[ True False True]
[False True False]
[False False True]]
print(t.masked_select(mask).numpy())
[0 2 4 8]
Source code in tinygrad/tensor.py
1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 | |
排序
¤
对张量沿指定维度执行双调排序。
等效元素的索引顺序始终保留。
参见:https://en.wikipedia.org/wiki/Bitonic_sorter
t = Tensor([[0.1, 0.5, 1.2, 3.4, 2.1], [2.2, 1.9, 0.3, 4.5, 0.8]])
print(t.numpy())
[[0.1 0.5 1.2 3.4 2.1]
[2.2 1.9 0.3 4.5 0.8]]
sorted_values, indices = t.sort(dim=1, descending=True)
print(sorted_values.numpy())
print(indices.numpy())
[[3.4 2.1 1.2 0.5 0.1]
[4.5 2.2 1.9 0.8 0.3]]
[[3 4 2 1 0]
[3 0 1 4 2]]
Source code in tinygrad/tensor.py
2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 | |
topk
¤
计算张量沿指定dim维度的前k个元素。
等效元素的索引顺序始终保留。
t = Tensor([[0.1, 0.5, 1.2, 3.4, 2.1], [2.2, 1.9, 0.3, 4.5, 0.8]])
print(t.numpy())
[[0.1 0.5 1.2 3.4 2.1]
[2.2 1.9 0.3 4.5 0.8]]
topk_values, topk_indices = t.topk(2, dim=1)
print(topk_values.numpy())
print(topk_indices.numpy())
[[3.4 2.1]
[4.5 2.2]]
[[3 4]
[3 0]]
Source code in tinygrad/tensor.py
2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 | |
神经网络(功能)¤
线性
¤
使用weight和bias对self进行线性变换。
See: https://pytorch.org/docs/stable/generated/torch.nn.Linear.html
t = Tensor([[1, 2], [3, 4]])
weight = Tensor([[1, 2], [3, 4]])
bias = Tensor([1, 2])
print(t.linear(weight, bias).numpy())
[[ 8 12]
[16 24]]
Source code in tinygrad/tensor.py
3668 3669 3670 3671 3672 3673 3674 3675 3676 3677 3678 3679 3680 3681 3682 | |
顺序
¤
将一系列函数应用于self,将每个函数的输出链接到下一个函数的输入。
t = Tensor([1, 2, 3])
print(t.sequential([lambda x: x * 2, lambda x: x + 1]).numpy())
[3 5 7]
Source code in tinygrad/tensor.py
3684 3685 3686 3687 3688 3689 3690 3691 3692 3693 | |
层归一化
¤
对输入的小批量应用层归一化。
t = Tensor.randn(8, 10, 16) * 2 + 8
print(t.mean().item(), t.std().item())
7.923046112060547 2.0072739124298096
t = t.layernorm()
print(t.mean().item(), t.std().item())
-5.940565817041943e-09 1.0003893375396729
Source code in tinygrad/tensor.py
3695 3696 3697 3698 3699 3700 3701 3702 3703 3704 3705 3706 3707 3708 3709 3710 3711 3712 | |
批归一化
¤
batchnorm(
weight: Tensor | None,
bias: Tensor | None,
mean: Tensor,
invstd: Tensor,
axis: int | tuple[int, ...] = 1,
) -> Tensor
对小批量输入应用批量归一化。
t = Tensor.randn(8, 4, 16, 16) * 2 + 8
print(t.mean().item(), t.std().item())
8.030410766601562 1.9699476957321167
t = t.batchnorm(None, None, t.mean(axis=(0,2,3)), t.var(axis=(0,2,3)).add(1e-5).rsqrt())
print(t.mean().item(), t.std().item())
6.026898518030066e-07 0.9998166561126709
Source code in tinygrad/tensor.py
3714 3715 3716 3717 3718 3719 3720 3721 3722 3723 3724 3725 3726 3727 3728 3729 3730 3731 3732 3733 3734 3735 | |
dropout
¤
dropout(p=0.5) -> Tensor
对self应用dropout。
注意
dropout仅在Tensor.training为True时应用。
Tensor.manual_seed(42)
t = Tensor.randn(2, 2)
with Tensor.train():
print(t.dropout().numpy())
[[ 0. 2.17 ]
[ 0. -0.1682]]
Source code in tinygrad/tensor.py
3737 3738 3739 3740 3741 3742 3743 3744 3745 3746 3747 3748 3749 3750 3751 3752 3753 3754 | |
one_hot
¤
将self转换为独热张量。
num_classes 默认为-1,这意味着num_classes将被推断为max(self) + 1。
t = Tensor([0, 1, 3, 3, 4])
print(t.one_hot(5).numpy())
[[1 0 0 0 0]
[0 1 0 0 0]
[0 0 0 1 0]
[0 0 0 1 0]
[0 0 0 0 1]]
Source code in tinygrad/tensor.py
3762 3763 3764 3765 3766 3767 3768 3769 3770 3771 3772 3773 3774 3775 | |
scaled_dot_product_attention
¤
scaled_dot_product_attention(
key: Tensor,
value: Tensor,
attn_mask: Tensor | None = None,
dropout_p: float = 0.0,
is_causal: bool = False,
) -> Tensor
计算缩放点积注意力。
self是查询张量,key是键张量,value是值张量。
q = Tensor.randn(2, 4, 8)
k = Tensor.randn(2, 4, 8)
v = Tensor.randn(2, 4, 8)
print(q.scaled_dot_product_attention(k, v).numpy())
[[[-0.1425 -0.1433 -0.3625 0.8853 -0.3129 1.0271 -0.0019 0.2445]
[-0.7137 0.2617 1.1393 0.692 0.0461 0.1132 0.391 -0.3563]
[ 0.4718 0.6791 0.8956 0.9387 -0.7198 0.753 0.5702 0.2661]
[-1.0183 0.005 0.9208 0.6447 0.2658 0.0411 0.2314 -0.4636]]
[[ 0.2928 -0.3364 -0.1937 -0.0755 -0.6196 -0.7339 0.8431 -0.3794]
[ 0.5915 0.3565 -0.6987 0.241 0.2624 -0.1074 -0.3026 -0.3574]
[ 0.3176 -0.4436 -0.3136 -0.5334 -0.5756 -0.851 0.9595 -0.4201]
[ 0.4378 0.0234 -0.0984 0.4847 -0.3579 -0.3998 0.3781 -0.2338]]]
Source code in tinygrad/tensor.py
3777 3778 3779 3780 3781 3782 3783 3784 3785 3786 3787 3788 3789 3790 3791 3792 3793 3794 3795 3796 3797 3798 3799 3800 3801 3802 | |
二元交叉熵
¤
计算self和Y之间的二元交叉熵损失。
See: https://pytorch.org/docs/stable/generated/torch.nn.BCELoss.html
t = Tensor([0.1, 0.9, 0.2])
Y = Tensor([0, 1, 0])
print(t.binary_crossentropy(Y).item())
0.14462155103683472
Source code in tinygrad/tensor.py
3809 3810 3811 3812 3813 3814 3815 3816 3817 3818 3819 3820 3821 | |
binary_crossentropy_logits
¤
计算self和Y之间的二元交叉熵损失,其中self是逻辑值。
See: https://pytorch.org/docs/stable/generated/torch.nn.BCEWithLogitsLoss.html
t = Tensor([-1, 2, -3])
Y = Tensor([0, 1, 0])
print(t.binary_crossentropy_logits(Y).item())
0.16292566061019897
Source code in tinygrad/tensor.py
3823 3824 3825 3826 3827 3828 3829 3830 3831 3832 3833 3834 3835 | |
稀疏分类交叉熵
¤
sparse_categorical_crossentropy(
Y: Tensor,
ignore_index: int = -1,
label_smoothing=0.0,
reduction: ReductionStr = "mean",
) -> Tensor
计算self和Y之间的稀疏分类交叉熵损失。
注意
self 是逻辑值而 Y 是目标标签。
注意:与PyTorch不同,此函数期望类别轴为-1
See: https://pytorch.org/docs/stable/generated/torch.nn.CrossEntropyLoss.html
t = Tensor([[-1, 2, -3], [1, -2, 3]])
Y = Tensor([1, 2])
print(t.sparse_categorical_crossentropy(Y).item())
0.09391524642705917
Source code in tinygrad/tensor.py
3837 3838 3839 3840 3841 3842 3843 3844 3845 3846 3847 3848 3849 3850 3851 3852 3853 3854 3855 3856 3857 3858 3859 3860 | |
交叉熵
¤
cross_entropy(
Y: Tensor,
reduction: ReductionStr = "mean",
label_smoothing: float = 0.0,
) -> Tensor
计算输入logits与目标之间的交叉熵损失。
注意
self 是逻辑值,Y 是目标标签或类别概率。
See: https://pytorch.org/docs/stable/generated/torch.nn.functional.cross_entropy.html
t = Tensor([[-1, 2, -3], [1, -2, 3]])
Y = Tensor([1, 2])
print(t.cross_entropy(Y).item())
0.09391524642705917
t = Tensor([[-1, 2, -3], [1, -2, 3]])
Y = Tensor([1, 2])
print(t.cross_entropy(Y, reduction='none').numpy())
[0.055 0.1328]
Source code in tinygrad/tensor.py
3862 3863 3864 3865 3866 3867 3868 3869 3870 3871 3872 3873 3874 3875 3876 3877 3878 3879 3880 3881 3882 3883 3884 3885 | |
nll_loss
¤
nll_loss(
Y: Tensor,
weight: Tensor | None = None,
ignore_index: int | None = None,
reduction: ReductionStr = "mean",
) -> Tensor
计算对数概率与目标标签之间的负对数似然损失。
注意
self 是log概率,Y 是Y标签或类别概率。
See: https://pytorch.org/docs/stable/generated/torch.nn.functional.nll_loss.html
t = Tensor([[-1, 2, -3], [1, -2, 3]])
Y = Tensor([1, 2])
print(t.log_softmax().nll_loss(Y).item())
0.09391524642705917
t = Tensor([[-1, 2, -3], [1, -2, 3]])
Y = Tensor([1, 2])
print(t.log_softmax().nll_loss(Y, reduction='none').numpy())
[0.055 0.1328]
Source code in tinygrad/tensor.py
3887 3888 3889 3890 3891 3892 3893 3894 3895 3896 3897 3898 3899 3900 3901 3902 3903 3904 3905 3906 3907 3908 3909 | |