Implementación de RNN y CNN basada en el conjunto de datos manuscritos MNIST de Pytorch

Implementación de RNN y CNN basada en el conjunto de datos manuscritos MNIST de Pytorch

LSTM procesa conjuntos de datos escritos a mano (problema de clasificación)
LSTM predice el costo hasta el sin (problema de regresión)

formato de parámetro de entrada de pytorch

input_size: la dimensión de la característica de la entrada, es decir, la longitud de one-hot en la palabra incrustada, la longitud de una palabra es 300, luego input_size es 300, el ancho de la imagen de entrada es 28, luego input_size es 28

hidden_size : dimensión de la característica del estado oculto, que puede configurar usted mismo

num_layers: el número de capas (que se distingue de la expansión de la secuencia), generalmente 1 o 2

sesgo : si es falso, LSTM no usará bih, bhh b_ {ih}, b_ {hh}segundoy h,segundoh h, El defecto es cierto.

batch_first : si es True, la forma del tensor de entrada y salida es (batch, time_step, input_size), de lo contrario (time_step batch, input_size)

abandono -Si es distinto de cero, se agregará un abandono a la salida del RNN, excepto para la última capa.

bidireccional l-Si es Verdadero, se convertirá en un RNN bidireccional, el valor predeterminado es Falso.


time_step: length es la longitud de una oración, el número de palabras contenidas en una oración,
batch_size: el número de rnn enviados en lotes El
siguiente código es de lstm

lstm输入是input, (h_0, c_0)
input (time_step, batch, input_size) 如果设置了batch_first,则batch为第一维。

(h_0, c_0) 隐层状态
h0 shape:(num_layers * num_directions, batch, hidden_size) 
c0 shape:(num_layers * num_directions, batch, hidden_size)

lstm输出是output, (h_n, c_n)
output (time_step, batch, hidden_size * num_directions) 包含每一个时刻的输出特征,如果设置了batch_first,则batch为第一维
(h_n, c_n) 隐层状态 
h_n shape: (num_layers * num_directions, batch, hidden_size)
c_n shape: (num_layers * num_directions, batch, hidden_size)

En algunos documentos, time_step y seq_len representan pasos de tiempo

class RNN(nn.Module):
    def __init__(self):
        super(RNN, self).__init__()

        self.rnn = nn.LSTM(         
            input_size=INPUT_SIZE,
            hidden_size=64,        
            num_layers=1,          
            batch_first=True,     #(batch, time_step, input_size)
        )

        self.out = nn.Linear(64, 10)  #Linear(num_layer*hidden_size,分类的个数)

    def forward(self, x):
        # x shape (batch, time_step, input_size)
        # r_out shape (batch, time_step, output_size)
        # h_n shape (n_layers, batch, hidden_size)
        # h_c shape (n_layers, batch, hidden_size)
        r_out, (h_n, h_c) = self.rnn(x, None)   # 初始状态为None
        out = self.out(r_out[:, -1, :])
        return out

Entre ellos, out = self.out (r_out [:, -1,:]) es tomar time_step como salida en el último momento como entrada de la capa linera, porque al ingresar un xt y ht-1 producirá un r_out y (h_n, h_c ), el hn generado continuará enviándose a la entrada de rnn para generar el siguiente r_out, por lo que la salida en el último momento debe tomarse como entrada

Una vez compilado el código completo, el
código de conjunto de datos manuscrito de implementación de CNN se publica de la siguiente manera

import torch
import torch.nn
from torch import nn
from torch.utils.data import Dataset
from torch.utils.data import DataLoader
import numpy as np
import matplotlib.pyplot as plt
from torchvision import datasets,transforms
import torch.optim as optim
import torch.nn.functional as F



BATCH_SIZE=512
EPOCHS=20
DEVICE=torch.device("cuda" if torch.cuda.is_available() else "cpu")


transform=transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.1307,), (0.3081,))
])
train_data=datasets.MNIST(root='./mnist',download=True,train=True,transform=transform)
test_data=datasets.MNIST(root='./mnist',download=True,train=False,transform=transform)

train_loader=DataLoader(train_data,batch_size=BATCH_SIZE,shuffle=True)
test_loader=DataLoader(test_data,batch_size=BATCH_SIZE,shuffle=True)







class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Sequential(
            nn.Conv2d(in_channels=1, out_channels=10, kernel_size=5),
            nn.ReLU(),
            nn.MaxPool2d(kernel_size=2)

        )
        self.conv2 = nn.Sequential(
            nn.Conv2d(in_channels=10, out_channels=20, kernel_size=3),
            nn.ReLU(),
            nn.MaxPool2d(2)
        )
        self.out = nn.Linear(20 * 5 * 5, 10)

    def forward(self, x):
        x = self.conv1(x)
        x = self.conv2(x)
        x = x.view(x.size(0), -1)
        output = self.out(x)
        return output


model = Net()  # 实例化网络net,再送入gpu训练
optimizer = optim.Adam(model.parameters())
criterion = nn.CrossEntropyLoss()


def train(model, device, train_loader, optimizer, epoch, criterion):
    model.train()
    for batch_idx, (data, target) in enumerate(train_loader):

        output = model(data)

        # loss=criterion(output,target)

        optimizer.zero_grad()
        loss = criterion(output, target)
        loss.backward()
        optimizer.step()

        if (batch_idx + 1) % 30 == 0:  # train_loader的长度为train_loader.dataset的长度除以batch_size
            print('Train Epoch:{} [{}/{} ({:.0f}%)]\tLoss:{:.6f}'.format(
                epoch, batch_idx * len(data), len(train_loader.dataset), 100. * batch_idx / len(train_loader),
                loss.item()
            ))


def test(model, device, test_loader):
    model.eval()
    test_loss = 0
    test_corr = 0
    with torch.no_grad():
        for img, label in test_loader:
            output = model(img)
            test_loss += criterion(output, label)
            pred = output.max(1, keepdim=True)[1]
            test_corr += pred.eq(label.view_as(pred)).sum().item()

        print('\nTest set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)\n'.format(
            test_loss, test_corr, len(test_loader.dataset), 100. * (test_corr / len(test_loader.dataset))
        ))


for epoch in range(1, EPOCHS + 1):
    train(model, DEVICE, train_loader, optimizer, epoch, criterion)
    test(model, DEVICE, test_loader)

Los resultados del entrenamiento son los siguientes
: Época del tren: 1 [14848/60000 (25%)] Pérdida: 0.809119
Época del tren: 1 [30208/60000 (50%)] Pérdida: 0.332066
Época del tren: 1 [45568/60000 (75%)] Pérdida: 0.248601

Equipo de prueba: Pérdida promedio: 3.3879, Precisión: 9515/10000 (95%)

Época del tren: 2 [14848/60000 (25%)] Pérdida: 0.200926
Época del tren: 2 [30208/60000 (50%)] Pérdida: 0.167642
Época del tren: 2 [45568/60000 (75%)] Pérdida: 0.129635

Equipo de prueba: Pérdida promedio: 1.9960, Precisión: 9700/10000 (97%)

Época del tren: 3 [14848/60000 (25%)] Pérdida: 0.097073
Época del tren: 3 [30208/60000 (50%)] Pérdida: 0.078300
Época del tren: 3 [45568/60000 (75%)] Pérdida: 0.095262

Equipo de prueba: Pérdida promedio: 1.5412, Precisión: 9764/10000 (98%)

Época del tren: 4 [14848/60000 (25%)] Pérdida: 0.067570
Época del tren: 4 [30208/60000 (50%)] Pérdida: 0.091387
Época del tren: 4 [45568/60000 (75%)] Pérdida: 0.058170

Equipo de prueba: Pérdida promedio: 1.3722, Precisión: 9795/10000 (98%)

Época del tren: 5 [14848/60000 (25%)] Pérdida: 0.081385
Época del tren: 5 [30208/60000 (50%)] Pérdida: 0.069488
Época del tren: 5 [45568/60000 (75%)] Pérdida: 0.108909

Equipo de prueba: Pérdida promedio: 1.1676, Precisión: 9818/10000 (98%)

Época del tren: 6 [14848/60000 (25%)] Pérdida: 0.060494
Época del tren: 6 [30208/60000 (50%)] Pérdida: 0.070833
Época del tren: 6 [45568/60000 (75%)] Pérdida: 0.085588

Equipo de prueba: Pérdida promedio: 1.0887, Precisión: 9833/10000 (98%)

Época del tren: 7 [14848/60000 (25%)] Pérdida: 0.067081
Época del tren: 7 [30208/60000 (50%)] Pérdida: 0.082414
Época del tren: 7 [45568/60000 (75%)] Pérdida: 0.045014

Equipo de prueba: Pérdida promedio: 1.0601, Precisión: 9837/10000 (98%)

Época del tren: 8 [14848/60000 (25%)] Pérdida: 0.062390
Época del tren: 8 [30208/60000 (50%)] Pérdida: 0.048241
Época del tren: 8 [45568/60000 (75%)] Pérdida: 0.042879

Equipo de prueba: Pérdida promedio: 0.9528, Precisión: 9836/10000 (98%)

Época del tren: 9 [14848/60000 (25%)] Pérdida: 0.048539
Época del tren: 9 [30208/60000 (50%)] Pérdida: 0.055073
Época del tren: 9 [45568/60000 (75%)] Pérdida: 0.055796

Equipo de prueba: Pérdida promedio: 0.8623, Precisión: 9866/10000 (99%)

Época del tren: 10 [14848/60000 (25%)] Pérdida: 0.051431
Época del tren: 10 [30208/60000 (50%)] Pérdida: 0.045435
Época del tren: 10 [45568/60000 (75%)] Pérdida: 0.075674

Equipo de prueba: Pérdida media: 0,7783, precisión: 9874/10000 (99%)

Época del tren: 11 [14848/60000 (25%)] Pérdida: 0.028392
Época del tren: 11 [30208/60000 (50%)] Pérdida: 0.049267
Época del tren: 11 [45568/60000 (75%)] Pérdida: 0.042472

Equipo de prueba: Pérdida promedio: 0.8189, Precisión: 9875/10000 (99%)

Época del tren: 12 [14848/60000 (25%)] Pérdida: 0.058731
Época del tren: 12 [30208/60000 (50%)] Pérdida: 0.025470
Época del tren: 12 [45568/60000 (75%)] Pérdida: 0.029647

Equipo de prueba: Pérdida media: 0,7829, precisión: 9871/10000 (99%)

Época del tren: 13 [14848/60000 (25%)] Pérdida: 0.052567
Época del tren: 13 [30208/60000 (50%)] Pérdida: 0.028609
Época del tren: 13 [45568/60000 (75%)] Pérdida: 0.020649

Equipo de prueba: Pérdida media: 0,7527, precisión: 9872/10000 (99%)

Época del tren: 14 [14848/60000 (25%)] Pérdida: 0.039200
Época del tren: 14 [30208/60000 (50%)] Pérdida: 0.019106
Época del tren: 14 [45568/60000 (75%)] Pérdida: 0.067107

Equipo de prueba: Pérdida media: 0,7386, Precisión: 9886/10000 (99%)

Época del tren: 15 [14848/60000 (25%)] Pérdida: 0.038181
Época del tren: 15 [30208/60000 (50%)] Pérdida: 0.022419
Época del tren: 15 [45568/60000 (75%)] Pérdida: 0.016036

Equipo de prueba: Pérdida promedio: 0.7954, Precisión: 9862/10000 (99%)

Época del tren: 16 [14848/60000 (25%)] Pérdida: 0.018675
Época del tren: 16 [30208/60000 (50%)] Pérdida: 0.039494
Época del tren: 16 [45568/60000 (75%)] Pérdida: 0.017992

Equipo de prueba: Pérdida media: 0,8029, Precisión: 9859/10000 (99%)

Época del tren: 17 [14848/60000 (25%)] Pérdida: 0.019442
Época del tren: 17 [30208/60000 (50%)] Pérdida: 0.014947
Época del tren: 17 [45568/60000 (75%)] Pérdida: 0.024432

Equipo de prueba: Pérdida promedio: 0.6863, Precisión: 9874/10000 (99%)

Época del tren: 18 [14848/60000 (25%)] Pérdida: 0.013267
Época del tren: 18 [30208/60000 (50%)] Pérdida: 0.022075
Época del tren: 18 [45568/60000 (75%)] Pérdida: 0.024906

Equipo de prueba: Pérdida promedio: 0.6707, Precisión: 9887/10000 (99%)

Época del tren: 19 [14848/60000 (25%)] Pérdida: 0.031900
Época del tren: 19 [30208/60000 (50%)] Pérdida: 0.014791
Época del tren: 19 [45568/60000 (75%)] Pérdida: 0.037303

Equipo de prueba: Pérdida media: 0,7329, Precisión: 9878/10000 (99%)

Época del tren: 20 [14848/60000 (25%)] Pérdida: 0.030795
Época del tren: 20 [30208/60000 (50%)] Pérdida: 0.016112
Época del tren: 20 [45568/60000 (75%)] Pérdida: 0.020148

Equipo de prueba: Pérdida promedio: 0.6894, Precisión: 9884/10000 (99%)

Supongo que te gusta

Origin blog.csdn.net/qq_41333847/article/details/109296140
Recomendado
Clasificación