Conversión de tipos de datos
-
numpy:
numpy
para obtener detalles sobre los tipos de datos en: https://numpy.org/doc/stable/reference/arrays.dtypes.html,
puedeastype()
convertirlos directamente con -
Antorcha: para
torch
los tipos de datos en antorcha, consulte:
https://pytorch.org/docs/stable/tensors.html
ParaTensor
el 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 serdtype
el tipo de datos contenido, o puede sercpu
ocuda
.
numpy
El 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 estorch.float32
de 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 alltorch.float32
, perotarget
el tipo de datos estorch.long
un 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 tiponn.Sigmoid()
aquí es el tipo predeterminado;target
torch.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()