天天看点

(pytorch-深度学习系列)pytorch数据操作

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>
           

继续阅读