拖了很久,因为之前没有学完python基础课,现在在学Java的同时还是要看一看的,学完python之后感觉也不是特别难了,加油!
基本上也是根据文档学,目前还没找到更好的方法。
主要是根据官方文档
一、基础语法
from __future__ import print_function#这行代码主要是兼容python2和3版本的输出用的,作用不大
1.构造矩阵
- 构造一个未初始化的5*3的矩阵
x=torch.empty(5,3)
- 构造一个随机初始化的矩阵,这些矩阵里面填充的数是在服从均匀分布的区间[0,1)随机抽取的数
x=torch.rand(5,3)
- 构造一个随机初始化的矩阵,这些矩阵里面填充的数是服从标准正态分布的数至于他的范围:以0为中心方差是1,在-1.96~+1.96范围内曲线下的面积等于0.9500(即取值在这个范围的概率为95%),在-2.58~+2.58范围内曲线下面积为0.9900(即取值在这个范围的概率为99%).。
x=torch.randn(4,4)
- 构造一个全0矩阵
x=torch.zeros(5,3,dtype=torch.long)#构造一个矩阵全为0并且数据类型是long
- 构造一个张量
x=torch.tensor([5.5,3])
print(x)
输出:
tensor([5.5000, 3.0000])
- 基于已存在的张量构造一个新的张量
x=torch.zeros(5,3,dtype=torch.long)
print(x)
x=x.new_ones(5,2,dtype=torch.double)#构造一个新的张量
print(x)
输出:
tensor([[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0]])
tensor([[1., 1.],
[1., 1.],
[1., 1.],
[1., 1.],
[1., 1.]], dtype=torch.float64)
这里补充一点,关于张量和矩阵的区别:
一维张量是标量,二位张量是向量,三位张量是矩阵,可以把张量理解成一个维数可变的向量。
- 构造一个与之前x维数相等的矩阵
x=torch.zeros(5,4,dtype=torch.long)
print(x)
x=torch.randn_like(x,dtype=torch.float)
print(x)
输出:
tensor([[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]])
tensor([[-1.3247e+00, -1.0348e+00, -1.0310e+00, -2.2126e+00],
[ 1.3069e-03, -6.2583e-01, 1.1289e-01, 1.1605e+00],
[-1.1379e+00, -1.3443e+00, 9.4737e-01, 8.9871e-01],
[-3.7237e-01, -5.3032e-01, 4.2989e-02, 6.1129e-01],
[ 1.7353e+00, 1.7845e-01, 4.8071e-01, -1.1661e+00]])
2.获取维度信息
利用x.size()
x=torch.rand(5,3)
print(x.size())
输出:
torch.Size([5, 3])
3.加法操作
x=torch.rand(5,3)
print(x)
y=torch.rand(5,3)
print(y)
print(x+y)
输出;
tensor([[0.2124, 0.1254, 0.5050],
[0.5305, 0.4193, 0.9696],
[0.9904, 0.7890, 0.3068],
[0.5130, 0.2575, 0.2976],
[0.1781, 0.9889, 0.4047]])
tensor([[0.5064, 0.8877, 0.6028],
[0.3291, 0.7500, 0.2110],
[0.2330, 0.6768, 0.3843],
[0.8501, 0.4492, 0.3122],
[0.6688, 0.2027, 0.1840]])
tensor([[0.7187, 1.0131, 1.1078],
[0.8595, 1.1693, 1.1806],
[1.2234, 1.4659, 0.6912],
[1.3631, 0.7067, 0.6098],
[0.8469, 1.1916, 0.5887]])
x+y的另外几种形式:
print(torch.add(x,y))
result=torch.empty(5,3)#提供一个未初始化的5*3的矩阵
torch.add(x,y,out=result)#把x+y的结果放到这个result矩阵里面
print(result)
y.add_(x)
print(y)
4.索引操作
索引与python一样
x=torch.rand(5,3)
print(x)
print(x[:,1])#输出第二列的所有的值,这地方跟python的索引很象,左边控制行,右边控制列
print(x[0:2,0])#这句话的意思是输出第一列里面的第一个和第二个值,0:2表示从下标0到2左闭右开,右边那个0代表第一列
结果:
tensor([[0.2514, 0.5554, 0.7013],
[0.7960, 0.6229, 0.4417],
[0.3836, 0.7721, 0.3296],
[0.5266, 0.5986, 0.9029],
[0.5180, 0.4973, 0.0778]])
tensor([0.5554, 0.6229, 0.7721, 0.5986, 0.4973])
tensor([0.2514, 0.7960])
5.改变张量大小
x=torch.randn(4,4)
print(x)
y=x.view(16)#从程序执行结果来看是变成1行16列,但是网上搜的并不是这里存疑
print(y)
z=x.view(-1,8)#这里的-1表示我不知道我想让他变成几行,但是我知道我想让他变成8列
print(z)
print(x.size(),y.size(),z.size())
输出;
tensor([[-0.1477, 2.0304, 1.6425, 0.3719],
[-0.0976, 0.9213, -0.3814, 0.1145],
[-0.4846, 0.1002, 1.3368, -0.8767],
[ 1.3328, 1.0376, -0.4583, -1.2641]])
tensor([-0.1477, 2.0304, 1.6425, 0.3719, -0.0976, 0.9213, -0.3814, 0.1145,
-0.4846, 0.1002, 1.3368, -0.8767, 1.3328, 1.0376, -0.4583, -1.2641])
tensor([[-0.1477, 2.0304, 1.6425, 0.3719, -0.0976, 0.9213, -0.3814, 0.1145],
[-0.4846, 0.1002, 1.3368, -0.8767, 1.3328, 1.0376, -0.4583, -1.2641]])
torch.Size([4, 4]) torch.Size([16]) torch.Size([2, 8])
6.获取张量的值
x=torch.randn(1)
print(x)
print(x.item())#本来x是一个张量,用.item来获取这个张量的值
输出:
tensor([-0.6752])
-0.6752027869224548