【学习笔记】【Pytorch】张量(Tensor)的基础操作

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

一、创建张量

参考
Pytorch中张量讲解 | Pytorch系列四
PyTorch中张量的创建方法的选择 | Pytorch系列五
官方文档

介绍PyTorch中的张量是我们在PyTorch中编程神经网络时会用到的数据结构
在对神经网络进行编程时数据预处理通常是整个过程的第一步数据预处理的一个目标是将原始输入数据转换成张量形式
PyTorch中的张量就是torch.Tensor的Python类的一个实例

1.使用数据创建张量

这些是在PyTorch中使用数据类似数组创建张量对象torch.Tensor类的实例的主要方法

  • torch.Tensor(data)
  • torch.tensor(data)
  • torch.as_tensor(data)
  • torch.from_numpy(data)

data可以使用Python列表或序列但是numpy.ndarrays是更常见的选择。

> data = np.array([1,2,3])
> type(data)
numpy.ndarray


> o1 = torch.Tensor(data)
> o2 = torch.tensor(data)
> o3 = torch.as_tensor(data)
> o4 = torch.from_numpy(data)

> print(o1)
> print(o2)
> print(o3)
> print(o4)
tensor([1., 2., 3.])
tensor([1, 2, 3], dtype=torch.int32)
tensor([1, 2, 3], dtype=torch.int32)
tensor([1, 2, 3], dtype=torch.int32)

2.无需数据的创建选项

torch.eye()函数它返回一个二维张量对角线上是1其他地方是0。eye() 这个名称与单位矩阵的思想有关单位矩阵是一个方阵主对角线上是1其他地方都是0。

> print(torch.eye(2))
tensor([
    [1., 0.],
    [0., 1.]
])

torch.zeros()函数它用指定形状参数的形状创建一个全部为 0 张量。

> print(torch.zeros([2,2]))
tensor([
    [0., 0.],
    [0., 0.]
])

torch.ones()函数它创建了一个全部为 1 的张量。

> print(torch.ones([2,2]))
tensor([
    [1., 1.],
    [1., 1.]
])

torch.rand()函数它创建了一个具有指定参数形状的张量其值是随机的。

> print(torch.rand([2,2]))
tensor([
    [0.0465, 0.4557],
    [0.6596, 0.0941]
])

3.torch.Tensor与torch.tensor的区别

参考
torch.Tensor()与torch.tensor()
总结

  • torch.Tensor()是python类调用torch.Tensor([1,2, 3, 4, 5])来构造一个tensor的时候,会调用Tensor类的构造函数,生成一个单精度浮点类型的张量。它不能指定数据类型,除非转成一个已知数据类型的张量,使用type_as(tesnor)将张量转换为给定类型的张量。

  • torch.tensor()是python的函数其中data可以是list,tuple,NumPy,ndarray等其他类型torch.tensor(data)会从data中的数据部分做拷贝(而不是直接引用)根据原始数据类型生成相应的torch.LongTensor 、torch.FloatTensor和torch.DoubleTensor。通过设置dtype的函数参数值生成对应类型的张量。

  • 共同点都是生成一个 torch.Tensor 对象

import torch

dd = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]

# 为了处理这个张量的形状我们将创建一个 torch.Tensor 对象
t = torch.tensor(dd)
print(t)
print(type(t))  # <class 'torch.Tensor'>
print(t.type())  # torch.LongTensor
print(t.dtype)  # torch.int64


t = torch.Tensor(dd)
print(t)
print(type(t))  # <class 'torch.Tensor'>
print(t.type())  # torch.FloatTensor
print(t.dtype)  # torch.float32

输出

tensor([[1, 2, 3],
        [4, 5, 6],
        [7, 8, 9]])
<class 'torch.Tensor'>
torch.LongTensor
torch.int64

tensor([[1., 2., 3.],
        [4., 5., 6.],
        [7., 8., 9.]])
<class 'torch.Tensor'>
torch.FloatTensor
torch.float32

4.PyTorch中张量的创建方法的选择

参考
PyTorch中张量的创建方法的选择 | Pytorch系列五

二、张量的属性

参考
Pytorch中张量讲解 | Pytorch系列四

作为神经网络程序员我们需要注意以下几点:

  • 张量包含统一类型dtype的数据。
  • 张量之间的计算取决于 dtype 和 device。

1.张量的 torch.dtype

在这里插入图片描述

2.张量的 torch.device

在这里插入图片描述

3.张量的 torch.layout

三、张量的形状

Tensor_object.shape 与 **Tensor_object.size()**操作一致。

import torch

dd = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]


# 为了处理这个张量的形状我们将创建一个 torch.Tensor 对象
t = torch.tensor(dd)
print(t)
print(type(t)) # <class 'torch.Tensor'>

# 张量的形状
print(t.shape)  # torch.Size([3, 3])
print(t.size())  # torch.Size([3, 3])

输出

tensor([[1, 2, 3],
        [4, 5, 6],
        [7, 8, 9]])
<class 'torch.Tensor'>

torch.Size([3, 3])
torch.Size([3, 3])

四、重构张量

参考
深度学习中关于张量的阶、轴和形状的解释 | Pytorch系列

介绍
当我们对神经网络进行编程时我们必须经常执行的一种操作叫做reshape

当我们的张量在网络中流动时在网络内部的不同点上会出现特定的形状作为神经网络程序员我们的工作就是理解传入的形状并有能力根据需要重构形状。

关于重构需要注意的一点是形状中的分量值的乘积必须等于张量中元素的总数

import torch


dd = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]  # 二阶张量
t = torch.tensor(dd)
print(t)

t = t.reshape(1, 9)
print(t)
print(t.shape)  # torch.Size([1, 9])

输出

tensor([[1, 2, 3],
        [4, 5, 6],
        [7, 8, 9]])
tensor([[1, 2, 3, 4, 5, 6, 7, 8, 9]])
torch.Size([1, 9])

reshape函数中-1表示的意义

-1表自动计算该位上的值。

import torch


dd = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]  # 二阶张量
t = torch.tensor(dd)
print(t)

t = t.reshape(-1, 1)
print(t)
print(t.shape)  # torch.Size([1, 9])

输出

tensor([[1, 2, 3],
        [4, 5, 6],
        [7, 8, 9]])
tensor([[1],
        [2],
        [3],
        [4],
        [5],
        [6],
        [7],
        [8],
        [9]])
torch.Size([9, 1])

五、CNN中的输入张量形状和特征图

参考
CNN中张量的输入形状和特征图 | Pytorch系列三

总结

  • 在CNN中的输入张量的形状通常长度为4[Batch_size, Channels, Height, Width]。使用一个4阶张量表示一整个批次的图片第一个轴代表图片批次(Image Batches)大小第二个轴代表图片的颜色通道(Image Color Channels)最后两个轴表示图像的高度(Height)和宽度(Width)。

    • 图片的颜色通道对于RGB图像此处的通常值为3如果使用灰度图像则通常值为1。此颜色通道的解释仅适用于输入张量。
    • 图片批次在神经网络中我们通常都是批量处理样本而不是只处理单个样本因此该轴的长度告诉我们该批次中有多少个样本。
      例如给定的张量的形状[312828]我们可以确定这个批次是含有三张28x28的灰度图片。
  • 输出通道卷积操作会改变高度和宽度尺寸以及通道数输出通道的数量是根据卷积层中使用的滤波器的数量而变化。卷积层的输出命名为输出通道而不是颜色通道。

  • 特征图Feature Maps对于输出通道我们不再拥有颜色通道而是修改过的通道我们称之为feature maps。这些所谓的特征图是使用输入颜色通道和卷积过滤器进行卷积的输出。
    之所以使用“特征”这个词是因为输出代表了图片的特定特征比如边缘这些映射是在网络在训练过程中学习的过程中出现的并且随着我们深入网络而变得更加复杂。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6