Conversión de tipos de datos en Numpy y Pytorch

Conversión de tipos de datos

  1. numpy: numpypara obtener detalles sobre los tipos de datos en: https://numpy.org/doc/stable/reference/arrays.dtypes.html,
    puede astype()convertirlos directamente con

  2. Antorcha: para torchlos tipos de datos en antorcha, consulte:
    https://pytorch.org/docs/stable/tensors.html
    Para Tensorel tipo de datos, puede agregar directamente .long(), .float(), .double(), .int()etc. después. También se puede usar .to(), y los parámetros dentro pueden ser dtypeel tipo de datos contenido, o puede ser cpuo cuda.

numpyEl tipo de datos predeterminado es float64, mientras que el tipo de datos predeterminado en torch es float32.
Ejemplo 1:

import numpy as np
arr = np.random.randn(2,2)
arr_float32 = arr.astype(np.float32)
print(arr.dtype, arr_float32.dtype)
#>>> dtype('float64') dtype('float32')

import torch
tensor = torch.randn(2,2)
tensor_long = tensor.long()
tensor_double = tensor.to(torch.double)
print(tensor.dtype,tensor_long.dtype,tensor_double.dtype)
#>>> torch.float32 torch.int64 torch.float64

Conversión de ubicación de almacenamiento

  • CPU → \rightarrow GPU:tensor.cuda()
  • GPU → \rightarrow CPU:tensor.cpu()

Puede haber parámetros del número de serie del dispositivo entre paréntesis, y también se pueden usar to(), generalmente de la siguiente manera:

DEVICE = torch.device('cuda' if torch.cuda.is_available else 'cpu')
tensor.to(DEVICE)

Conversión de datos con numpy y torch

  • antorcha → \rightarrow numpy:tensor.numpy()

  • numpy → \rightarrow antorcha:torch.Tensor(arr),torch.tensor(arr)otorch.from_numpy()

    NOTA: Los datos en la GPU no se pueden convertir directamente a los datos en numpy, primero se deben convertir a los datos en la CPU. torch.Tensor(arr)El tipo de datos obtenido es torch.float32de precisión simple, lo que cambiará el tipo de datos original.Este tipo es más común en los cálculos de redes neuronales, mientras que los otros dos no lo harán.

Ejemplo 2:

arr = tensor.numpy()
arr_double = arr.astype(np.float64)
tensor_T = tensor.Tensor(arr_doubel)
tensor_t = tensor.tensor(arr_double)
tensor_n = tensor.from_numpy(arr_double)
print(arr.dtype,arr_double.dtype,tensor_T.dtype,tensor_t.dtype,tensor_n.dtype)
#>>> float32 float64 torch.float32 torch.float64 torch.float64

Requisitos de la función de pérdida en antorcha para diferentes tipos de datos

Para el uso de la función de pérdida, consulte: https://pytorch.org/docs/stable/nn.html#loss-functions, aquí solo se menciona el tipo de datos.

  • torch.nn.CrossEntropyLoss: Los datos en el proceso de cálculo son all torch.float32, pero targetel tipo de datos es torch.longun entero largo, porque necesita convertirse en un vector one-hot;
  • torch.nn.BCELoss: Se usa en el caso de dos clasificaciones, y generalmente se usa con clases.El tipo nn.Sigmoid()aquí es el tipo predeterminado;targettorch.flaot32

Ejemplo: (fuente sitio web oficial)

>>> loss = nn.CrossEntropyLoss()
>>> input = torch.randn(3, 5, requires_grad=True)
>>> target = torch.empty(3, dtype=torch.long).random_(5)
>>> output = loss(input, target)
>>> output.backward()

>>> m = nn.Sigmoid()
>>> loss = nn.BCELoss()
>>> input = torch.randn(3, requires_grad=True)
>>> target = torch.empty(3).random_(2)
>>> output = loss(m(input), target)
>>> output.backward()

Supongo que te gusta

Origin blog.csdn.net/Huang_Fj/article/details/120798943
Recomendado
Clasificación