Este artigo participou da atividade "Cerimônia de Criação do Recém-chegado" e iniciou o caminho da criação de Nuggets juntos
04 Manipulação de dados + pré-processamento de dados [aprendizagem profunda prática v2]
Manipulação de dados P1
Exemplo de matriz N-dimensional
- Arrays N-dimensionais são os principais dados para aprendizado de máquina e redes neurais
criar matriz
- Forma: por exemplo, matriz 3 × 4
- Tipo de dados de cada elemento: por exemplo, float de 32 bits
- O valor de cada elemento, como todos os 0s, ou um número aleatório
elemento de acesso
Implementação de manipulação de dados P2
manipulação de dados
Primeiro, importamos torch
. Observe que, embora seja chamado de PyTorch, devemos importar torch
em vez depytorch
import torch
复制代码
Um tensor representa uma matriz de valores, que pode ter várias dimensões
x = torch.arange(12)
x
复制代码
tensor([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
复制代码
A forma do tensor e o número total de elementos no tensor podem ser acessados através das shape
propriedades do tensor
x.shape
复制代码
torch.Size([12])
复制代码
x.numel()
复制代码
12
复制代码
Para alterar a forma de um tensor sem alterar o número e o valor dos elementos, você pode chamar a reshape
função
X = x.reshape(3, 4)
X
复制代码
Use todos os 0s, todos os 1s, outras constantes ou números amostrados aleatoriamente de uma distribuição 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]])
复制代码
Atribua um valor definido a cada elemento no tensor desejado fornecendo uma lista Python (ou lista aninhada) 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])
复制代码
Operadores aritméticos padrão comuns ( , , e +
) -
podem *
ser atualizados para operações elementares/
**
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.]))
复制代码
Aplique mais cálculos em elementos
torch.exp(x)
复制代码
tensor([2.7183e+00, 7.3891e+00, 5.4598e+01, 2.9810e+03])
复制代码
Também 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 binários por meio de operadores lógicos
X == Y
复制代码
tensor([[False, True, False, True],
[False, False, False, False],
[False, False, False, False]])
复制代码
A soma de todos os elementos em um tensor produz um tensor com apenas um elemento
X.sum()
复制代码
tensor(66.)
复制代码
Mesmo que as formas sejam diferentes, ainda podemos realizar operações elementares chamando o mecanismo de transmissão
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]
O último elemento pode ser selecionado com [1:3]
e o segundo e terceiro elementos podem ser selecionados com
X[-1], X[1:3]
复制代码
(tensor([ 8., 9., 10., 11.]),
tensor([[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.]]))
复制代码
Além de ler, também podemos escrever elementos na matriz especificando o índice
X[1, 2] = 9
X
复制代码
tensor([[ 0., 1., 2., 3.],
[ 4., 5., 9., 7.],
[ 8., 9., 10., 11.]])
复制代码
Para atribuir o mesmo valor a vários elementos, basta indexar todos os elementos e atribuí-los
X[0:2, :] = 12
X
复制代码
tensor([[12., 12., 12., 12.],
[12., 12., 12., 12.],
[ 8., 9., 10., 11.]])
复制代码
A execução de algumas operações pode fazer com que a memória seja alocada para novos resultados
before = id(Y)
Y = Y + X
id(Y) == before
复制代码
False
复制代码
realizar operações no local
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
Também podemos usar X[:] = X + Y
ou X += Y
para reduzir a sobrecarga de memória da operação se ela não for reutilizada em cálculos subsequentes
before = id(X)
X += Y
id(X) == before
复制代码
True
复制代码
Converter para Tensor NumPy
A = X.numpy()
B = torch.tensor(A)
type(A), type(B)
复制代码
(numpy.ndarray, torch.Tensor)
复制代码
Converter um tensor de tamanho 1 em um escalar Python
a = torch.tensor([3.5])
a, a.item(), float(a), int(a)
复制代码
(tensor([3.5000]), 3.5, 3.5, 3)
复制代码
Implementação de pré-processamento de dados P3
pré-processamento de dados
Crie um conjunto de dados artificial e armazene-o em um arquivo csv (valores separados por vírgula)
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')
复制代码
Carregar o conjunto de dados bruto do arquivo csv criado
# 如果没有安装pandas,只需要取消以下行的注释:
# !pip install pandas
import pandas as pd
data = pd.read_csv(data_file)
print(data)
复制代码
Se em Jupyter, pode ser print(data)
escrito comodata
NumRooms Alley Price
0 NaN Pave 127500
1 2.0 NaN 106000
2 4.0 NaN 178100
3 NaN NaN 140000
复制代码
Para lidar com dados ausentes, métodos típicos incluem interpolação e exclusão , aqui, consideraremos a interpolação
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 ou discretos em , tratamos "NaN" como uma categoria
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 as entradas agora inputs
e outputs
em são tipos numéricos, elas podem ser convertidas para o formato 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]))
复制代码
Controle de qualidade de manipulação de dados 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])
复制代码