Notas do processo de aprendizagem (2) notas de aprendizagem do documento oficial pytorch

referência:

[Entenda tensores rapidamente] Explique o tensor de uma forma popular por meio de torch.rand e o blog CSDN muito trabalhador de exemplos_Neo

Notas de estudo do documento oficial do Pytorch - 3. Construir o blog-CSDN do Model_pytorch build_model_Coding_Qi

 http://t.csdn.cn/66ERp

Início rápido - Tutoriais PyTorch 2.0.1 + documentação cu117  (2 mensagens) princípios básicos do pytorch - otimizando parâmetros do modelo (6)_torch.optim.sgd(model.parameters(), lr=learning_ra_A Little Groundhog's Blog -CSDN Blog

1. Tensor tensor

-Estrutura de dados (semelhante à matriz array) - use tensores para codificar a entrada, saída e parâmetros do modelo

-última coluna-1

- concatenar tensores, .cat

 dim refere-se à dimensão, sem colchetes, dim =0;1 colchete, dim =1;

 -matplotlib é uma biblioteca de plotagem 2D para Python

2. Conjuntos de dados e carregadores de dados

figura: recurso; Rótulo: rótulo;

&Conjunto de dados personalizado: três funções

_init_: Executa uma vez ao instanciar o objeto do conjunto de dados, inicializando a imagem, arquivo de anotação e duas transformações (transform, target_transform)

_len_: Retorna o número de amostras no conjunto de dados

_getitem_: A partir do índice fornecido, converta o rótulo da imagem em um tensor e retorne a imagem do tensor e o rótulo correspondente

3. Transformação

transformar e target_transform

Recursos como tensores normalizados e rótulos como tensores codificados one-hot, usando .ToTensor和Lambda进行转换

transform=ToTensor(),

target_transform=Lambda(lambda y: torch.zeros(10, dtype=torch.float).scatter_(0, torch.tensor(y), value=1))

&ToTensor converte uma imagem PIL ou NumPy em tal situação, e o valor da intensidade de pixel da imagem está na faixa [0., 1.]

Conversão &Lambda: é uma função Lambda que converte números inteiros em tensores codificados one-hot.

O código de status natural é: 000.001.010.011.100.101.
A codificação one-hot é: 000001.000010.000100.001000.010000.100000.

target_transform = Lambda(lambda y: torch.zeros(
    10, dtype=torch.float).scatter_(dim=0, index=torch.tensor(y), value=1))
首先创建一个大小为 10(我们数据集中的标签数量)的零张量,并调用 scatter_ 在标签给出的索引上分配一个

scatter_(input, dim, index, src): Preencha os dados em src na entrada na direção de dim de acordo com o índice em index. Pode ser entendido como colocar elementos ou modificar elementos     

  • dim: ao longo de qual dimensão indexar
  • índice: índice do elemento usado para dispersão
  • src: o elemento de origem usado para dispersão, que pode ser um escalar ou um tensor

4. Construa o modelo

- Defina a rede neural subclassificando nn.Module, use __init__ para inicializar a camada de rede neural e cada subclasse nn.Module implementa a operação dos dados de entrada no método forward

A camada -Flatten é usada para "achatar" a entrada, ou seja, para converter a entrada multidimensional em uma dimensão. É frequentemente usada na transição da camada convolucional para a camada totalmente conectada . (3, 32, 64) são dados tridimensionais, com um total de 3*32*64=6144 elementos. Puxe esses dados tridimensionais em uma linha e o comprimento da linha é 6144.

-nn.Sequential Uma classe é  torch.nn um tipo de contêiner de sequência no contêiner. Ao aninhar várias classes relacionadas às funções específicas da rede neural no contêiner, a construção do modelo de rede neural é concluída; o conteúdo entre parênteses desta classe é o conteúdo do modelo de rede neural que construímos. estrutura específica

-nn.Linear: usado para definir a camada linear do modelo, completar a transformação linear mencionada acima, os parâmetros incluem (número do recurso de entrada, número do recurso de saída, se deve usar polarização (o padrão é verdadeiro)) e o peso do a dimensão correspondente será gerada automaticamente Parâmetros e tendências

-nn.ReLU A classe pertence à classificação de ativação não linear e não requer a passagem de parâmetros por padrão na definição.

-logits é um vetor que geralmente é lançado para  softmax na próxima etapa  . função exponencial normalizada softmax

-A função de torch.rand em termos leigos é gerar dados uniformemente distribuídos . Insira alguns números entre colchetes de torch.rand() para gerar um tensor de várias dimensões.

x = torch.rand(3,4): tensor bidimensional, três linhas e quatro colunas

Também é relativamente fácil entender o tensor tridimensional. O tensor bidimensional pode ser considerado como um plano, e o tensor tridimensional pode ser considerado como muitos planos tensores bidimensionais dispostos em paralelo.

Por exemplo, nossa imagem RGB comum pode ser entendida como três imagens bidimensionais em tons de cinza colocadas lado a lado.

5. Derivação automática Autograd 

Gradiente: a derivada da função de perda em relação aos parâmetros

Algoritmo de retropropagação: Os parâmetros (pesos do modelo) são ajustados de acordo com o gradiente da função de perda em relação aos parâmetros fornecidos.

 torch.autograd  suporta cálculo automático de gradientes para qualquer gráfico computacional .

6. Parâmetros de otimização de otimização

- Durante cada iteração de treinamento do modelo, o modelo faz uma estimativa sobre a saída, calcula o erro entre a estimativa e o rótulo real, coleta a derivada do erro em relação aos seus parâmetros e otimiza esses parâmetros usando gradiente descendente

-Controle o processo de otimização do modelo ajustando hiperparâmetros. Diferentes valores de hiperparâmetros afetarão o treinamento do modelo e a velocidade de convergência

-Perda: Faça uma previsão usando a entrada de uma determinada amostra de dados e compare-a com o valor verdadeiro do rótulo de dados.

-Otimizador SGD

-Loop de treinamento, três etapas para otimização

·Chame optimizador.zero_grad() para redefinir o gradiente dos parâmetros do modelo. Os gradientes são somados por padrão; para evitar contagem dupla, nós os zeramos explicitamente em cada iteração.
· Retropropague a perda de previsão chamando loss.backward(). PyTorch armazena o gradiente de cada parâmetro associado à perda.
·Assim que tivermos os gradientes, chamamos optimer.step() para ajustar os parâmetros através dos gradientes coletados durante a retropropagação.

Código de otimização do loop de treinamento:

def train_loop(dataloader, model, loss_fn, optimizer):
    size = len(dataloader.dataset)
    for batch, (X, y) in enumerate(dataloader):
        # Compute prediction and loss
        pred = model(X)
        loss = loss_fn(pred, y)
 
        # Backpropagation
        optimizer.zero_grad() #用于清空优化器中的梯度
        loss.backward()    #计算损失函数对参数的梯度,自动求导
        optimizer.step()    #根据梯度更新网络参数的值
 
        if batch % 100 == 0:
            loss, current = loss.item(), batch * len(X)
            print(f"loss: {loss:>7f}  [{current:>5d}/{size:>5d}]")

Use o algoritmo de gradiente descendente para atualizar os parâmetros do modelo. Neste algoritmo, é necessário calcular o gradiente da função de perda em relação aos parâmetros do modelo. Este processo de cálculo é o algoritmo de retropropagação.

A função de loss.backward() é derivar a função de perda e obter o gradiente de cada parâmetro do modelo em relação à função de perda. Esse gradiente pode representar o tamanho e a direção da contribuição dos parâmetros do modelo para a função de perda no estado atual, ou seja, a direção e o tamanho da atualização dos parâmetros.

Os parâmetros atualizados serão usados ​​para o próximo cálculo de avanço e cálculo de retropropagação.

7. Salvar e carregar modelo Salvar e carregar o modelo

Os modelos PyTorch armazenam parâmetros aprendidos em   um dicionário de estado interno chamado state_dict . Esses parâmetros podem ser salvos através do método torch.save


 

Acho que você gosta

Origin blog.csdn.net/qq_51141671/article/details/131788405
Recomendado
Clasificación