[Conversión de tipo de matriz a imagen 1]: tipo de tensor, tipo de datos y conversión entre tipos de datos en Pytorch

Uno, el tipo y tipo de datos de tensor en Pytorch

torch.TensorEs una matriz multidimensional que contiene elementos, pero estos elementos pertenecen a un solo elemento de tipo de datos (a diferencia de la lista, que puede almacenar diferentes tipos de elementos en la misma secuencia).

1.0 Tipo predeterminado y tipo de datos

torch.TensorEs torch.FlaotTensorla abreviatura del tipo de tensor predeterminado ( ), y se coloca en la CPU de manera predeterminada.Cuando se usa esta declaración torch.FloatTensorde tipo , se generarán datos de tipo y tipo de datos torch.float32.

torch.ensorEs torch.LongTensorla abreviatura del tipo de tensor predeterminado ( ), y se coloca en la CPU de manera predeterminada.Cuando se usa esta declaración torch.LongTensorde tipo , se generarán datos de tipo y tipo de datos torch.int64.

Nota: no existe torch.cuda.Tensorotorch.cuda.tensor

import torch
print("测试开始")

print("==默认Tensor数据类型==")
tensor= torch.Tensor([1,2])
print("type(tensor):",type(tensor))
print("tensor.type():",tensor.type())
print("tensor.dtype:",tensor.dtype)
print("tensor.is_cuda:",tensor.is_cuda)


print("==默认tensor数据类型==")
tensor= torch.tensor([1,2])
print("type(tensor):",type(tensor))
print("tensor.type():",tensor.type())
print("tensor.dtype:",tensor.dtype)
print("tensor.is_cuda:",tensor.is_cuda)

imagen-20210318093904908

1.1 Resumen de tipos de tensor y tipos de datos

Pytorch define 8种CPU张量类型y correspondiente 8种GPU张量类型, (lo mismo CPU张量, el GPU张量tipo corresponde al mismo tipo de datos de almacenamiento), la correspondencia específica se muestra en la siguiente tabla:

Tipo de datos Tensor de CPU Tensor de GPU
Coma flotante de 32 bits -> torch.float32 torch.FloatTensor torch.cuda.FloatTensor
Punto flotante de 64 bits -> torch.float64 torch.DoubleTensor torch.cuda.DoubleTensor
Punto flotante de 16 bits -> torch.float16 torch.HalfTensor torch.cuda.HalfTensor
Entero de 8 bits (sin firmar) -> torch.uint8 torch.ByteTensor torch.cuda.ByteTensor
Entero de 8 bits (con signo) -> torch.int8 torch.CharTensor torch.cuda.CharTensor
Entero de 16 bits (con signo) -> torch.int16 torch.ShortTensor torch.cuda.ShortTensor
Entero de 32 bits (con signo) -> torch.int32 torch.IntTensor torch.cuda.IntTensor
Entero de 64 bits (con signo) -> torch.int64 torch.LongTensor torch.cuda.LongTensor

1.2 Visualización del tipo de tensor y tipo de datos

Los resultados obtenidos para este 16种tensor变量uso type()函数son<class 'torch.Tensor'>

Resuelve 张量类型necesidades específicas de uso,tensor_name.type()

Resuelve la 数据存储类型necesidad de uso correspondiente ,tensor_name.dtype

Ejemplo: ver 1.0

1.3 ¿Los datos del tensor pertenecen a la pantalla cuda?

Para saber si es necesario utilizar un tensor específico del tipo cuda,tensor_name.iscuda

Ejemplo: ver 1.0

1.4 Ejemplo: 16 tipos de inicialización de matriz y visualización de tipo de datos

import torch
print("测试开始")

print("===torch.FloatTensor===")
tensor = torch.FloatTensor([1,2])
print("type(FloatTensor):",type(tensor))
print("FloatTensor.type():",tensor.type())
print("FloatTensor.dtype:",tensor.dtype)
print("FloatTensor.is_cuda:",tensor.is_cuda)
print("===torch.cuda.FloatTensor===")
tensor = torch.cuda.FloatTensor([1,2])
print("type(cuda_FloatTensor):",type(tensor))
print("cuda_FloatTensor.type():",tensor.type())
print("cuda_FloatTensor.dtype:",tensor.dtype)
print("cuda_FloatTensor.is_cuda:",tensor.is_cuda)

print("===torch.DoubleTensor===")
tensor = torch.DoubleTensor([1,2])
print("type(DoubleTensor):",type(tensor))
print("DoubleTensor.type():",tensor.type())
print("DoubleTensor.dtype:",tensor.dtype)
print("DoubleTensor.is_cuda:",tensor.is_cuda)
print("===torch.cuda.DoubleTensor===")
tensor = torch.cuda.DoubleTensor([1,2])
print("type(cuda_DoubleTensor):",type(tensor))
print("cuda_DoubleTensor.type():",tensor.type())
print("cuda_DoubleTensor.dtype:",tensor.dtype)
print("cuda_DoubleTensor.is_cuda:",tensor.is_cuda)

print("===torch.HalfTensor===")
tensor = torch.HalfTensor([1,2])
print("type(cuda_DoubleTensor):",type(tensor))
print("HalfTensor.type():",tensor.type())
print("HalfTensor.dtype:",tensor.dtype)
print("HalfTensor.is_cuda:",tensor.is_cuda)
print("===torch.cuda.HalfTensor===")
tensor = torch.cuda.HalfTensor([1,2])
print("type(cuda_HalfTensor):",type(tensor))
print("cuda_HalfTensor.type():",tensor.type())
print("cuda_HalfTensor.dtype:",tensor.dtype)
print("cuda_HalfTensor.is_cuda:",tensor.is_cuda)

print("===torch.ByteTensor===")
tensor = torch.ByteTensor([1,2])
print("type(ByteTensor):",type(tensor))
print("ByteTensor.type():",tensor.type())
print("ByteTensor.dtype:",tensor.dtype)
print("ByteTensor.is_cuda:",tensor.is_cuda)
print("===torch.cuda.ByteTensor===")
tensor = torch.cuda.ByteTensor([1,2])
print("type(cuda_ByteTensor):",type(tensor))
print("cuda_ByteTensor.type():",tensor.type())
print("cuda_ByteTensor.dtype:",tensor.dtype)
print("cuda_ByteTensor.is_cuda:",tensor.is_cuda)

print("===torch.CharTensor===")
tensor = torch.CharTensor([1,2])
print("type(CharTensor):",type(tensor))
print("CharTensor.type():",tensor.type())
print("CharTensor.dtype:",tensor.dtype)
print("CharTensor.is_cuda:",tensor.is_cuda)
print("===torch.cuda.CharTensor===")
tensor = torch.cuda.CharTensor([1,2])
print("type(cuda_CharTensor):",type(tensor))
print("cuda_CharTensor.type():",tensor.type())
print("cuda_CharTensor.dtype:",tensor.dtype)
print("cuda_CharTensor.is_cuda:",tensor.is_cuda)

print("===torch.ShortTensor===")
tensor = torch.ShortTensor([1,2])
print("type(ShortTensor):",type(tensor))
print("ShortTensor.type():",tensor.type())
print("ShortTensor.dtype:",tensor.dtype)
print("ShortTensor.is_cuda:",tensor.is_cuda)
print("===torch.cuda.ShortTensor===")
tensor = torch.cuda.ShortTensor([1,2])
print("type(cuda_ShortTensor):",type(tensor))
print("cuda_ShortTensor.type():",tensor.type())
print("cuda_ShortTensor.dtype:",tensor.dtype)
print("cuda_ShortTensor.is_cuda:",tensor.is_cuda)

print("===torch.IntTensor===")
tensor = torch.IntTensor([1,2])
print("type(IntTensor):",type(tensor))
print("IntTensor.type():",tensor.type())
print("IntTensor.dtype:",tensor.dtype)
print("IntTensor.is_cuda:",tensor.is_cuda)
print("===torch.cuda.IntTensor===")
tensor = torch.cuda.IntTensor([1,2])
print("type(cuda_IntTensor):",type(tensor))
print("cuda_IntTensor.type():",tensor.type())
print("cuda_IntTensor.dtype:",tensor.dtype)
print("cuda_IntTensor.is_cuda:",tensor.is_cuda)

print("===torch.LongTensor===")
tensor = torch.LongTensor([1,2])
print("type(LongTensor):",type(tensor))
print("LongTensor.type():",tensor.type())
print("LongTensor.dtype:",tensor.dtype)
print("LongTensor.is_cuda:",tensor.is_cuda)
print("===torch.cuda.LongTensor===")
tensor = torch.cuda.LongTensor([1,2])
print("type(cuda_LongTensor):",type(tensor))
print("cuda_LongTensor.type():",tensor.type())
print("cuda_LongTensor.dtype:",tensor.dtype)
print("cuda_LongTensor.is_cuda:",tensor.is_cuda)

imagen-20210317222913066

En segundo lugar, la conversión entre tipos de datos de tensor

2.0 La necesidad de conversión de datos

Tensor puede hacer el mismo tipo de operación, ya sea en CPUy GPUla misma especie, si el mismo tipo de almacenamiento de datos

2.1 Conversión del tipo de tensor de CPU y tipo de tensor de GPU

cpu_tensor.cuda()
gpu_tensor.cpu()

Por ejemplo

import torch
print("测试开始")

print("==默认数据类型==")
tensor= torch.FloatTensor([1,2])
print("初始化CPU张量是否在GPU上:",tensor.is_cuda)
tensor.cuda()
print("CPU张量使用.cuda()后是否在GPU上:",tensor.is_cuda)
tensor = tensor.cuda()
print("CPU张量使用.cuda()并重新赋值后是否在GPU上:",tensor.is_cuda)

print("="*10)
tensor= torch.cuda.FloatTensor([1,2])
print("初始化GPU张量是否在GPU上:",tensor.is_cuda)
tensor.cpu()
print("GPU张量使用.cpu()并重新赋值后是否在GPU上:",tensor.is_cuda)
tensor = tensor.cpu()
print("GPU张量使用.cpu()并重新赋值后是否在GPU上:",tensor.is_cuda)

imagen-20210317203626826

2.2 Otras conversiones de tipos de datos que no involucran CPU y GPU

2.2.1 tensor.int () proyecta el tensor al tipo int

Los ocho tipos de CPU se convierten en torch.IntTensor, y el tipo de almacenamiento de datos es el tipo torch.int32

Los ocho tipos de GPU se convierten a torch.cuda.IntTensor, y el tipo de almacenamiento de datos es el tipo torch.int32

2.2.2 tensor.long () proyecta el tensor como tipo largo

Los ocho tipos de CPU se convierten en torch.LongTensor y el tipo de almacenamiento de datos es torch.int64

Los ocho tipos de GPU se convierten a torch.cuda.LongTensor y el tipo de almacenamiento de datos es torch.int64

2.2.3 tensor.half () proyecta el tensor como un tipo de punto flotante de precisión media

Los ocho tipos de CPU se convierten en torch.HalfTensor, y el tipo de almacenamiento de datos es torch.float16

Los ocho tipos de GPU se convierten a torch.cuda.HalfTensor y el tipo de almacenamiento de datos es torch.float16

2.2.4 tensor.double () proyecta el tensor a tipo doble

Los ocho tipos de CPU se convierten en torch.DoubleTensor, y el tipo de almacenamiento de datos es torch.float64

Los ocho tipos de GPU se convierten a torch.cuda.DoubleTensor, y el tipo de almacenamiento de datos es el tipo torch.float64

2.2.5 tensor.float () proyecta el tensor como un tipo flotante

Los ocho tipos de CPU se convierten en torch.FloatTensor, y el tipo de almacenamiento de datos es el tipo torch.float32

Los ocho tipos de GPU se convierten a torch.cuda.FloatTensor, y el tipo de almacenamiento de datos es torch.float32

2.2.6 tensor.char () proyecta el tensor al tipo char

Los ocho tipos de CPU se convierten a torch.CharTensor y el tipo de almacenamiento de datos es el tipo torch.int8

Los ocho tipos de GPU se convierten a torch.cuda.CharTensor, y el tipo de almacenamiento de datos es torch.int8

2.2.7 tensor.byte () proyecta el tensor al tipo de byte

Los ocho tipos de CPU se convierten en torch.ByteTensor, y el tipo de almacenamiento de datos es el tipo torch.uint8

Los ocho tipos de GPU se convierten a torch.cuda.ByteTensor, y el tipo de almacenamiento de datos es el tipo torch.uint8

2.2.8 tensor.short () proyecta el tensor al tipo corto

Los ocho tipos de CPU se convierten en torch.ShortTensor, y el tipo de almacenamiento de datos es torch.int16

Los ocho tipos de GPU se convierten a torch.cuda.ShortTensor, y el tipo de almacenamiento de datos es torch.int16

2.3 Usar la función tensor.type ()

La función de esta función es convertir el tensor a otro tipo de tensor, que puede convertir el tipo de CPU y el tipo de GPU simultáneamente, como torch.IntTensor -> torch.cuda.floatTensor

La sintaxis es la siguiente:

tensor_new = tensor.type(new_type=None, async=False)

Por ejemplo:

import torch
print("测试开始")
tensor = torch.FloatTensor([1,2])
print("before type function:",tensor.type())
tensor = tensor.type(torch.int32)
print("after type function:",tensor.type())

imagen-20210318001735082

2.4 Use type_as (tesnor) para convertir un tensor en un tensor de un tipo dado

La función de esta función es convertir el tensor a otro tipo de tensor, que puede convertir el tipo de CPU y el tipo de GPU simultáneamente, como torch.IntTensor -> torch.cuda.floatTensor

Si el tensor ya es del tipo especificado, no se realizará ninguna conversión.

La sintaxis es la siguiente:

tensor_new = tensor1.type_as(tensor2)

Por ejemplo:

import torch
print("测试开始")
tensor1 = torch.FloatTensor([1,2])
tensor2 = torch.IntTensor([1,2])
print("before type_as function:",tensor1.type())
tensor1 = tensor1.type_as(tensor2)
print("after type function:",tensor1.type())

resultado de la operación:
imagen-20210318001826667

ÚLTIMO, referencias

pytorch determina el tipo de variable y si es cuda_ Ipoh No. 2 -CSDN blog
torch.Tensor - PyTorch Documento chino
pytorch: tipo de construcción y conversión de tensor _JNing-CSDN blog
Pytorch tensor soporta tipos de datos y su conversión - conozca casi el
conocimiento de pytorch de declaraciones de datos de un tensor, conversión de tipos. Ajuste los puntos de atención de rensnet34. _yangdeshun888's blog -CSDN blog
Pytorch basic data types_torrent source -CSDN blog_pytorch data types

Supongo que te gusta

Origin blog.csdn.net/qq_41554005/article/details/114964670
Recomendado
Clasificación