pytorch数据操作
基本数据操作,都详细注释了,如下:
import torch
#5x3的未初始化的Tensor
x = torch.empty(5, 3)
print("5x3的未初始化的Tensor:")
print(x)
print("******************************")
#5x3的随机初始化的Tensor:
x = torch.rand(5, 3)
print("5x3的随机初始化的Tensor:")
print(x)
print("******************************")
#5x3的long型全0的Tensor:
x = torch.zeros(5, 3, dtype=torch.long)
print("5x3的long型全0的Tensor:")
print(x)
print("******************************")
#根据源数据创建
x = [5, 4, 3]
x = torch.tensor(x, dtype=torch.float64)
print("根据源数据创建tensor:")
print(x)
print("******************************")
#返回的tensor默认具有相同的torch.dtype和torch.device
#建立一个tensor
x = x.new_ones(5, 3, dtype=torch.float64)
print("建立的tensor")
print(x)
print("******************************")
#通过对已有的tensor 指定新的数据类型 创建tensor
x = torch.randn_like(x, dtype=torch.float)
print("通过对已有的tensor 指定新的数据类型 创建tensor:")
print(x)
print("******************************")
#通过shape或者size()来获取Tensor的形状:
print("通过shape或者size()来获取Tensor的形状:")
print(x.size())
print(x.shape)
print("******************************")
#tensor加法:
y = torch.rand(5, 3)
print(x + y)
print("******************************")
#add函数实现tensor相加
print(torch.add(x, y))
print("******************************")
#add函数指定输出相加
result = torch.empty(5, 3)
torch.add(x, y, out=result)
print(result)
print("******************************")
#使用内联函数实现加发
y.add_(x)
print(y)
#PyTorch操作inplace版本都有后缀_, 例如x.copy_(y), x.t_()
print("******************************")
#类似numpy的索引方式
y=x[0,:]
y += 2
print(y)
print("修改了y,那么原tensor也会被修改")
print(x[0, :])
print("******************************")
#改变形状 view函数
y = x.view(15)
z = x.view(-1, 5) # -1所指的维度可以根据其他维度的值推出来
print(x.size(), y.size(), z.size())
print("******************************")
#view()返回的新Tensor与源Tensor虽然可能有不同的size,但是是共享data的,即更改一个,另一个也会变化
x += 1
print(x)
print(y) # 也加了1
print("******************************")
#使用clone函数获得一个真正的数据副本3.
x_clone = x.clone().view(15)
x += 1
print(x)
print(x_clone)
print("******************************")
#使用clone还有一个好处是会被记录在计算图中,即梯度回传到副本时也会传到源Tensor。
#另外一个常用的函数就是item(), 它可以将一个标量Tensor转换成一个Python number:
x = torch.randn(1)
print(x)
print(x.item())
print("******************************")
#形状不同的tensor进行计算,会触发广播机制
x = torch.arange(1, 3).view(1, 2)
y = torch.arange(0, 3).view(3, 1)
print(x)
print(y)
print(x + y)
print(torch.add(x, y))
#print(x.add_(y))
#由于x和y分别是1行2列和3行1列的矩阵,如果要计算x + y,那么x中第一行的2个元素被广播(复制)到了第二行和第三行,而y中第一列的3个元素被广播(复制)到了第二列。如此,就可以对2个3行2列的矩阵按元素相加。
print("******************************")
#索引操作与clone操作不同,不会开辟新的内存,但是运算操作会开辟新的内存
x = torch.tensor([1, 2])
y = torch.tensor([3, 4])
id_before = id(y)
y[:] = y + x
print(id(y) == id_before) # True
print("未开辟新的内存")
x = torch.tensor([1, 2])
y = torch.tensor([3, 4])
id_before = id(y)
y = y + x
print(id(y) == id_before) # False
print("开辟了新的内存")
print("使用 add函数指定输出也可以避免开辟内存:")
x = torch.tensor([1, 2])
y = torch.tensor([3, 4])
id_before = id(y)
torch.add(x, y, out=y) # y += x, y.add_(x)
print(id(y) == id_before) # True
print("******************************")
#Tensor转NumPy:tensor.numpy()
a = torch.ones(5)
b = a.numpy()
print(a, b)
a += 1
print(a, b)
b += 1
print(a, b)
#torch.from_numpy
import numpy as np
a = np.ones(5)
b = torch.from_numpy(a)
print(a, b)
a += 1
print(a, b)
b += 1
print(a, b)
#torch.tensor(numpy)这样会开辟新的内存
c = torch.tensor(a)
a += 1
print(a, c)
#测试gpu环境
# 以下代码只有在PyTorch GPU版本上才会执行
if torch.cuda.is_available():
device = torch.device("cuda") # GPU
y = torch.ones_like(x, device=device) # 直接创建一个在GPU上的Tensor
x = x.to(device) # 等价于 .to("cuda")
z = x + y
print(z)
print(z.to("cpu", torch.double)) # to()还可以同时更改数据类型
输出结果如下:
Microsoft Windows [版本 10.0.18363.1082]
(c) 2019 Microsoft Corporation。保留所有权利。
C:\Users\20626>d:
D:\>cd workspace
D:\workspace>cd "python Workspace"
D:\workspace\python Workspace>cd deeplearning-pytorch
D:\workspace\python Workspace\deeplearning-pytorch>activate pytorch_gpu
D:\workspace\python Workspace\deeplearning-pytorch>conda.bat activate pytorch_gpu
(pytorch_gpu) D:\workspace\python Workspace\deeplearning-pytorch>python chapter-1.py
5x3的未初始化的Tensor:
tensor([[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]])
******************************
5x3的随机初始化的Tensor:
tensor([[0.7356, 0.2419, 0.0771],
[0.2658, 0.9888, 0.8363],
[0.7294, 0.4150, 0.9157],
[0.8824, 0.1682, 0.8827],
[0.7691, 0.0690, 0.8040]])
******************************
5x3的long型全0的Tensor:
tensor([[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0]])
******************************
根据源数据创建tensor:
tensor([5., 4., 3.], dtype=torch.float64)
******************************
建立的tensor
tensor([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]], dtype=torch.float64)
******************************
通过对已有的tensor 指定新的数据类型 创建tensor:
tensor([[ 0.1654, -0.1937, 1.2233],
[-0.4828, -0.8176, -0.3672],
[ 0.5762, 0.6457, -0.0862],
[ 0.9082, -0.3934, -0.3169],
[ 0.1841, 0.8648, 1.1849]])
******************************
通过shape或者size()来获取Tensor的形状:
torch.Size([5, 3])
torch.Size([5, 3])
******************************
tensor([[ 1.0382e+00, -4.8804e-04, 2.1988e+00],
[-2.5249e-01, -1.7922e-01, 4.7531e-01],
[ 1.1131e+00, 7.3895e-01, 5.4079e-01],
[ 1.8360e+00, -3.9927e-02, -1.0457e-01],
[ 4.7496e-01, 1.6555e+00, 1.2281e+00]])
******************************
tensor([[ 1.0382e+00, -4.8804e-04, 2.1988e+00],
[-2.5249e-01, -1.7922e-01, 4.7531e-01],
[ 1.1131e+00, 7.3895e-01, 5.4079e-01],
[ 1.8360e+00, -3.9927e-02, -1.0457e-01],
[ 4.7496e-01, 1.6555e+00, 1.2281e+00]])
******************************
tensor([[ 1.0382e+00, -4.8804e-04, 2.1988e+00],
[-2.5249e-01, -1.7922e-01, 4.7531e-01],
[ 1.1131e+00, 7.3895e-01, 5.4079e-01],
[ 1.8360e+00, -3.9927e-02, -1.0457e-01],
[ 4.7496e-01, 1.6555e+00, 1.2281e+00]])
******************************
tensor([[ 1.0382e+00, -4.8804e-04, 2.1988e+00],
[-2.5249e-01, -1.7922e-01, 4.7531e-01],
[ 1.1131e+00, 7.3895e-01, 5.4079e-01],
[ 1.8360e+00, -3.9927e-02, -1.0457e-01],
[ 4.7496e-01, 1.6555e+00, 1.2281e+00]])
******************************
tensor([2.1654, 1.8063, 3.2233])
修改了y,那么原tensor也会被修改
tensor([2.1654, 1.8063, 3.2233])
******************************
torch.Size([5, 3]) torch.Size([15]) torch.Size([3, 5])
******************************
tensor([[3.1654, 2.8063, 4.2233],
[0.5172, 0.1824, 0.6328],
[1.5762, 1.6457, 0.9138],
[1.9082, 0.6066, 0.6831],
[1.1841, 1.8648, 2.1849]])
tensor([3.1654, 2.8063, 4.2233, 0.5172, 0.1824, 0.6328, 1.5762, 1.6457, 0.9138,
1.9082, 0.6066, 0.6831, 1.1841, 1.8648, 2.1849])
******************************
tensor([[4.1654, 3.8063, 5.2233],
[1.5172, 1.1824, 1.6328],
[2.5762, 2.6457, 1.9138],
[2.9082, 1.6066, 1.6831],
[2.1841, 2.8648, 3.1849]])
tensor([3.1654, 2.8063, 4.2233, 0.5172, 0.1824, 0.6328, 1.5762, 1.6457, 0.9138,
1.9082, 0.6066, 0.6831, 1.1841, 1.8648, 2.1849])
******************************
tensor([-0.5415])
-0.5414556860923767
******************************
tensor([[1, 2]])
tensor([[0],
[1],
[2]])
tensor([[1, 2],
[2, 3],
[3, 4]])
tensor([[1, 2],
[2, 3],
[3, 4]])
******************************
True
未开辟新的内存
False
开辟了新的内存
使用 add函数指定输出也可以避免开辟内存:
True
******************************
tensor([1., 1., 1., 1., 1.]) [1. 1. 1. 1. 1.]
tensor([2., 2., 2., 2., 2.]) [2. 2. 2. 2. 2.]
tensor([3., 3., 3., 3., 3.]) [3. 3. 3. 3. 3.]
[1. 1. 1. 1. 1.] tensor([1., 1., 1., 1., 1.], dtype=torch.float64)
[2. 2. 2. 2. 2.] tensor([2., 2., 2., 2., 2.], dtype=torch.float64)
[3. 3. 3. 3. 3.] tensor([3., 3., 3., 3., 3.], dtype=torch.float64)
[4. 4. 4. 4. 4.] tensor([3., 3., 3., 3., 3.], dtype=torch.float64)
tensor([2, 3], device='cuda:0')
tensor([2., 3.], dtype=torch.float64)
(pytorch_gpu) D:\workspace\python Workspace\deeplearning-pytorch>