Este artículo ha participado en la actividad "Ceremonia de creación de recién llegados", y ha iniciado juntos el camino de la creación de Nuggets.
04 Manipulación de datos + preprocesamiento de datos [aprendizaje profundo práctico v2]
Manipulación de datos P1
Ejemplo de matriz N-dimensional
- Las matrices N-dimensionales son los datos principales para el aprendizaje automático y las redes neuronales
crear matriz
- Forma: por ejemplo, matriz de 3 × 4
- Tipo de datos de cada elemento: por ejemplo, flotante de 32 bits
- El valor de cada elemento, como todos los 0 o un número aleatorio
elemento de acceso
Implementación de manipulación de datos P2
manipulación de datos
Primero, importamos torch
. Tenga en cuenta que aunque se llama PyTorch, debemos importar torch
en lugar depytorch
import torch
复制代码
Un tensor representa una matriz de valores, que pueden tener múltiples dimensiones
x = torch.arange(12)
x
复制代码
tensor([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
复制代码
Se puede acceder a shape
la forma del tensor y al número total de elementos en el tensor a través de las propiedades del tensor
x.shape
复制代码
torch.Size([12])
复制代码
x.numel()
复制代码
12
复制代码
Para cambiar la forma de un tensor sin cambiar el número y el valor de los elementos, puede llamar a la reshape
función
X = x.reshape(3, 4)
X
复制代码
Use todos los 0, todos los 1, otras constantes o números muestreados aleatoriamente de una distribución específica
torch.zeros((2, 3, 4))
复制代码
tensor([[[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]],
[[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]]])
复制代码
torch.ones((2, 3, 4))
复制代码
tensor([[[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]],
[[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]]])
复制代码
torch.randn(3, 4)
复制代码
tensor([[ 0.2104, 1.4439, -1.3455, -0.8273],
[ 0.8009, 0.3585, -0.2690, 1.6183],
[-0.4611, 1.5744, -0.4882, -0.5317]])
复制代码
Asigne un valor definido a cada elemento en el tensor deseado proporcionando una lista de Python (o una lista anidada) de valores
torch.tensor([[2, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])
复制代码
tensor([[2, 1, 4, 3],
[1, 2, 3, 4],
[4, 3, 2, 1]])
复制代码
torch.tensor([[[2, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]]])
复制代码
tensor([[[2, 1, 4, 3],
[1, 2, 3, 4],
[4, 3, 2, 1]]])
复制代码
torch.tensor([[[2, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]]]).shape
复制代码
torch.Size([1, 3, 4])
复制代码
Los operadores aritméticos estándar comunes ( +
, -
, *
y ) /
se **
pueden actualizar a operaciones por elementos
x = torch.tensor([1.0, 2, 4, 8])
y = torch.tensor([2, 2, 2, 2])
x + y, x - y, x * y, x / y, x**y
复制代码
(tensor([ 3., 4., 6., 10.]),
tensor([-1., 0., 2., 6.]),
tensor([ 2., 4., 8., 16.]),
tensor([0.5000, 1.0000, 2.0000, 4.0000]),
tensor([ 1., 4., 16., 64.]))
复制代码
Aplicar más cálculos por elementos
torch.exp(x)
复制代码
tensor([2.7183e+00, 7.3891e+00, 5.4598e+01, 2.9810e+03])
复制代码
También podemos concatenar juntos
X = torch.arange(12, dtype=torch.float32).reshape((3, 4))
Y = torch.tensor([[2.0, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])
torch.cat((X, Y), dim=0), torch.cat((X, Y), dim=1)
复制代码
(tensor([[ 0., 1., 2., 3.],
[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.],
[ 2., 1., 4., 3.],
[ 1., 2., 3., 4.],
[ 4., 3., 2., 1.]]),
tensor([[ 0., 1., 2., 3., 2., 1., 4., 3.],
[ 4., 5., 6., 7., 1., 2., 3., 4.],
[ 8., 9., 10., 11., 4., 3., 2., 1.]]))
复制代码
Construir tensores binarios a través de operadores lógicos
X == Y
复制代码
tensor([[False, True, False, True],
[False, False, False, False],
[False, False, False, False]])
复制代码
La suma de todos los elementos en un tensor produce un tensor con un solo elemento
X.sum()
复制代码
tensor(66.)
复制代码
Incluso si las formas son diferentes, aún podemos realizar operaciones por elementos llamando al mecanismo de transmisión
a = torch.arange(3).reshape((3, 1))
b = torch.arange(2).reshape((1, 2))
a, b
复制代码
(tensor([[0],
[1],
[2]]),
tensor([[0, 1]]))
复制代码
a + b
复制代码
tensor([[0, 1],
[1, 2],
[2, 3]])
复制代码
[-1]
El último elemento se puede seleccionar con [1:3]
y el segundo y tercer elementos se pueden seleccionar con
X[-1], X[1:3]
复制代码
(tensor([ 8., 9., 10., 11.]),
tensor([[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.]]))
复制代码
Además de leer, también podemos escribir elementos en la matriz especificando el índice
X[1, 2] = 9
X
复制代码
tensor([[ 0., 1., 2., 3.],
[ 4., 5., 9., 7.],
[ 8., 9., 10., 11.]])
复制代码
Para asignar el mismo valor a varios elementos, solo necesitamos indexar todos los elementos y asignarlos
X[0:2, :] = 12
X
复制代码
tensor([[12., 12., 12., 12.],
[12., 12., 12., 12.],
[ 8., 9., 10., 11.]])
复制代码
La ejecución de algunas operaciones puede hacer que se asigne memoria para nuevos resultados
before = id(Y)
Y = Y + X
id(Y) == before
复制代码
False
复制代码
realizar operaciones en el lugar
Z = torch.zeros_like(Y)
print('id(Z):', id(Z))
Z[:] = X + Y
print('id(Z):', id(Z))
复制代码
id(Z): 140452400950336
id(Z): 140452400950336
复制代码
X
También podemos usar X[:] = X + Y
o X += Y
para reducir la sobrecarga de memoria de la operación si no se reutiliza en cálculos posteriores
before = id(X)
X += Y
id(X) == before
复制代码
True
复制代码
Convertir a tensor NumPy
A = X.numpy()
B = torch.tensor(A)
type(A), type(B)
复制代码
(numpy.ndarray, torch.Tensor)
复制代码
Convierta un tensor de tamaño 1 en un escalar de Python
a = torch.tensor([3.5])
a, a.item(), float(a), int(a)
复制代码
(tensor([3.5000]), 3.5, 3.5, 3)
复制代码
Implementación de preprocesamiento de datos P3
Preprocesamiento de datos
Cree un conjunto de datos artificial y guárdelo en un archivo csv (valores separados por comas)
import os
os.makedirs(os.path.join('..', 'data'), exist_ok=True)
data_file = os.path.join('..', 'data', 'house_tiny.csv')
with open(data_file, 'w') as f:
f.write('NumRooms,Alley,Price\n')
f.write('NA,Pave,127500\n')
f.write('2,NA,106000\n')
f.write('4,NA,178100\n')
f.write('NA,NA,140000\n')
复制代码
Cargue el conjunto de datos sin procesar desde el archivo csv creado
# 如果没有安装pandas,只需要取消以下行的注释:
# !pip install pandas
import pandas as pd
data = pd.read_csv(data_file)
print(data)
复制代码
Si en Jupyter, se puede print(data)
escribir comodata
NumRooms Alley Price
0 NaN Pave 127500
1 2.0 NaN 106000
2 4.0 NaN 178100
3 NaN NaN 140000
复制代码
Para lidiar con los datos faltantes, los métodos típicos incluyen la interpolación y la eliminación , aquí consideraremos la interpolación.
inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2]
inputs = inputs.fillna(inputs.mean())
print(inputs)
复制代码
NumRooms Alley
0 3.0 Pave
1 2.0 NaN
2 4.0 NaN
3 3.0 NaN
复制代码
Para inputs
valores categóricos o discretos en , tratamos "NaN" como una categoría
inputs = pd.get_dummies(inputs, dummy_na=True)
print(inputs)
复制代码
NumRooms Alley_Pave Alley_nan
0 3.0 1 0
1 2.0 0 1
2 4.0 0 1
3 3.0 0 1
复制代码
Todas las entradas en ahora inputs
y outputs
en son de tipo numérico, se pueden convertir al formato de tensor
import torch
X, y = torch.tensor(inputs.values), torch.tensor(outputs.values)
X, y
复制代码
(tensor([[3., 1., 0.],
[2., 0., 1.],
[4., 0., 1.],
[3., 0., 1.]], dtype=torch.float64),
tensor([127500, 106000, 178100, 140000]))
复制代码
Control de calidad de manipulación de datos P4
a = torch.arange(12)
b = a.reshape((3,4))
b[:] = 2
a
复制代码
tensor([2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])
复制代码