qidao123.com技术社区-IT企服评测·应用市场

标题: 深度学习之神经网络框架搭建及模型优化 [打印本页]

作者: 卖不甜枣    时间: 2025-2-12 11:38
标题: 深度学习之神经网络框架搭建及模型优化
神经网络框架搭建及模型优化


  
1 数据及配置


1.1 配置

需要安装PyTorch,下载安装torch、torchvision、torchaudio,GPU需下载cuda版本,CPU可直接下载
  1. cuda版本较大,最后通过控制面板pip install +存储地址离线下载,
  2. CPU版本需再下载安装VC_redist.x64.exe,可下载上述三个后运行,通过报错网址直接下载安装
复制代码
1.2 数据

利用的是 torchvision.datasets.MNIST的手写数据,包括特征数据和结果种别
1.3 函数导入

  1. import torch
  2. from torch import nn
  3. from torch.utils.data import DataLoader
  4. from torchvision import datasets
  5. from torchvision.transforms import ToTensor
复制代码
1.4 数据函数

  1. train_data = datasets.MNIST(
  2.     root='data',        # 数据集存储的根目录
  3.     train=True,         # 加载训练集
  4.     download=True,      # 如果数据集不存在,自动下载
  5.     transform=ToTensor() # 将图像转换为张量
  6. )
复制代码

1.5 数据打包

train_dataloader = DataLoader(train_data, batch_size=64)

代码展示:
  1. import torchprint(torch.__version__)import torch
  2. from torch import nn
  3. from torch.utils.data import DataLoader
  4. from torchvision import datasets
  5. from torchvision.transforms import ToTensor
  6. train_data = datasets.MNIST(    root = 'data',    train = True,    download = True,    transform = ToTensor())test_data = datasets.MNIST(    root = 'data',    train = False,    download = True,    transform = ToTensor())print(len(train_data))print(len(test_data))from matplotlib import pyplot as pltfigure = plt.figure()for i in range(9):    img,label = train_data[i+59000]    figure.add_subplot(3,3,i+1)    plt.title(label)    plt.axis('off')    plt.imshow(img.squeeze(),cmap='gray')    a = img.squeeze()plt.show()train_dataloader = DataLoader(train_data, batch_size=64)test_dataloader= DataLoader(test_data, batch_size=64)
复制代码
运行结果:


调试查看:


2 神经网络框架搭建


2.1 框架确认

在搭建神经网络框架前,需先确认创建怎样的框架,现在并没有理论的指导,凭履历创建框架如下:
输入层:输入的图像数据(28*28)个神经元。
中间层1:全连接层,128个神经元,
中间层2:全连接层,256个神经元,
输出层:全连接层,10个神经元,对应10个种别。
需注意,中间层需利用鼓励函数激活,对累加数举行非线性的映射,以及forward前向流传过程的函数名不可更改
2.2 函数搭建


  1. # 定义一个神经网络类,继承自 nn.Module
  2. class NeuralNetwork(nn.Module):
  3.     def __init__(self):
  4.         super().__init__()  # 调用父类 nn.Module 的构造函数
  5.         # 定义网络层
  6.         self.flatten = nn.Flatten()  # 将输入展平为一维向量,适用于将图像数据(如28x28)展平为784维
  7.         self.hidden1 = nn.Linear(28*28, 128)  # 第一个全连接层,输入维度为784(28*28),输出维度为128
  8.         self.hidden2 = nn.Linear(128, 256)    # 第二个全连接层,输入维度为128,输出维度为256
  9.         self.out = nn.Linear(256, 10)         # 输出层,输入维度为256,输出维度为10(对应10个类别)
  10.     # 定义前向传播过程
  11.     def forward(self, x):
  12.         x = self.flatten(x)       # 将输入数据展平
  13.         x = self.hidden1(x)       # 通过第一个全连接层
  14.         x = torch.sigmoid(x)      # 对第一个全连接层的输出应用Sigmoid激活函数
  15.         x = self.hidden2(x)       # 通过第二个全连接层
  16.         x = torch.sigmoid(x)      # 对第二个全连接层的输出应用Sigmoid激活函数
  17.         x = self.out(x)           # 通过输出层
  18.         return x                  # 返回最终的输出
复制代码
2.3 框架上传


模型输出展示:

3 模型优化


3.1 函数明白


3.2 训练模型和测试模型代码

  1. optimizer = torch.optim.Adam(model.parameters(),lr=0.001)
  2. loss_fn = nn.CrossEntropyLoss()
  3. def train(dataloader,model,loss_fn,optimizer):
  4.     model.train()
  5.     batch_size_num = 1
  6.     for x,y in dataloader:
  7.         x,y = x.to(device),y.to(device)
  8.         pred = model.forward(x)
  9.         loss = loss_fn(pred,y)
  10.         optimizer.zero_grad()
  11.         loss.backward()
  12.         optimizer.step()
  13.         loss_value = loss.item()
  14.         if batch_size_num %100 ==0:
  15.             print(f'loss: {loss_value:>7f}  [number: {batch_size_num}]')
  16.         batch_size_num +=1
  17. train(train_dataloader,model,loss_fn,optimizer)
  18. def test(dataloader,model,loss_fn):
  19.     size = len(dataloader.dataset)
  20.     num_batches = len(dataloader)
  21.     model.eval()
  22.     test_loss,correct = 0,0
  23.     with torch.no_grad():
  24.         for x,y in dataloader:
  25.             x,y = x.to(device),y.to(device)
  26.             pred = model.forward(x)
  27.             test_loss += loss_fn(pred,y).item()
  28.             correct +=(pred.argmax(1) == y).type(torch.float).sum().item()
  29.             a = (pred.argmax(1)==y)
  30.             b = (pred.argmax(1)==y).type(torch.float)
  31.     test_loss /=num_batches
  32.     correct /= size
  33.     print(f'test result: \n Accuracy: {(100*correct)}%, Avg loss:{test_loss}')
复制代码
4 最终代码测试


4.1 SGD优化算法

torch.optim.SGD(model.parameters(),lr=0.01)
代码展示:
  1. import torchprint(torch.__version__)import torch
  2. from torch import nn
  3. from torch.utils.data import DataLoader
  4. from torchvision import datasets
  5. from torchvision.transforms import ToTensor
  6. train_data = datasets.MNIST(    root = 'data',    train = True,    download = True,    transform = ToTensor())test_data = datasets.MNIST(    root = 'data',    train = False,    download = True,    transform = ToTensor())print(len(train_data))print(len(test_data))from matplotlib import pyplot as pltfigure = plt.figure()for i in range(9):    img,label = train_data[i+59000]    figure.add_subplot(3,3,i+1)    plt.title(label)    plt.axis('off')    plt.imshow(img.squeeze(),cmap='gray')    a = img.squeeze()plt.show()train_dataloader = DataLoader(train_data, batch_size=64)test_dataloader= DataLoader(test_data, batch_size=64)device = 'cuda' if torch.cuda.is_available() else 'mps' if torch.backends.mps.is_available() else 'cpu'print(f'Using {device} device')class NeuralNetwork(nn.Module):    def __init__(self):        super().__init__()        self.flatten = nn.Flatten()        self.hidden1 = nn.Linear(28*28,128)        self.hidden2 = nn.Linear(128, 256)        self.out = nn.Linear(256,10)    def forward(self,x):        x = self.flatten(x)        x = self.hidden1(x)        x = torch.sigmoid(x)        x = self.hidden2(x)        x = torch.sigmoid(x)        x = self.out(x)        return xmodel = NeuralNetwork().to(device)#print(model)optimizer = torch.optim.SGD(model.parameters(),lr=0.01)loss_fn = nn.CrossEntropyLoss()def train(dataloader,model,loss_fn,optimizer):    model.train()    batch_size_num = 1    for x,y in dataloader:        x,y = x.to(device),y.to(device)        pred = model.forward(x)        loss = loss_fn(pred,y)        optimizer.zero_grad()        loss.backward()        optimizer.step()        loss_value = loss.item()        if batch_size_num %100 ==0:            print(f'loss: {loss_value:>7f}  [number: {batch_size_num}]')        batch_size_num +=1def test(dataloader,model,loss_fn):    size = len(dataloader.dataset)    num_batches = len(dataloader)    model.eval()    test_loss,correct = 0,0    with torch.no_grad():        for x,y in dataloader:            x,y = x.to(device),y.to(device)            pred = model.forward(x)            test_loss += loss_fn(pred,y).item()            correct +=(pred.argmax(1) == y).type(torch.float).sum().item()            a = (pred.argmax(1)==y)            b = (pred.argmax(1)==y).type(torch.float)    test_loss /=num_batches    correct /= size    print(f'test result: \n Accuracy: {(100*correct)}%, Avg loss:{test_loss}')#train(train_dataloader,model,loss_fn,optimizer)test(test_dataloader,model,loss_fn)
复制代码
运行结果:

4.2 Adam优化算法

自适应算法,torch.optim.Adam(model.parameters(),lr=0.01)
运行结果:

4.3 多次迭代

代码展示:
  1. import torchprint(torch.__version__)import torch
  2. from torch import nn
  3. from torch.utils.data import DataLoader
  4. from torchvision import datasets
  5. from torchvision.transforms import ToTensor
  6. train_data = datasets.MNIST(    root = 'data',    train = True,    download = True,    transform = ToTensor())test_data = datasets.MNIST(    root = 'data',    train = False,    download = True,    transform = ToTensor())print(len(train_data))print(len(test_data))from matplotlib import pyplot as pltfigure = plt.figure()for i in range(9):    img,label = train_data[i+59000]    figure.add_subplot(3,3,i+1)    plt.title(label)    plt.axis('off')    plt.imshow(img.squeeze(),cmap='gray')    a = img.squeeze()plt.show()train_dataloader = DataLoader(train_data, batch_size=64)test_dataloader= DataLoader(test_data, batch_size=64)device = 'cuda' if torch.cuda.is_available() else 'mps' if torch.backends.mps.is_available() else 'cpu'print(f'Using {device} device')class NeuralNetwork(nn.Module):    def __init__(self):        super().__init__()        self.flatten = nn.Flatten()        self.hidden1 = nn.Linear(28*28,128)        self.hidden2 = nn.Linear(128, 256)        self.out = nn.Linear(256,10)    def forward(self,x):        x = self.flatten(x)        x = self.hidden1(x)        x = torch.sigmoid(x)        x = self.hidden2(x)        x = torch.sigmoid(x)        x = self.out(x)        return xmodel = NeuralNetwork().to(device)#print(model)optimizer = torch.optim.Adam(model.parameters(),lr=0.01)loss_fn = nn.CrossEntropyLoss()def train(dataloader,model,loss_fn,optimizer):    model.train()    batch_size_num = 1    for x,y in dataloader:        x,y = x.to(device),y.to(device)        pred = model.forward(x)        loss = loss_fn(pred,y)        optimizer.zero_grad()        loss.backward()        optimizer.step()        loss_value = loss.item()        if batch_size_num %100 ==0:            print(f'loss: {loss_value:>7f}  [number: {batch_size_num}]')        batch_size_num +=1def test(dataloader,model,loss_fn):    size = len(dataloader.dataset)    num_batches = len(dataloader)    model.eval()    test_loss,correct = 0,0    with torch.no_grad():        for x,y in dataloader:            x,y = x.to(device),y.to(device)            pred = model.forward(x)            test_loss += loss_fn(pred,y).item()            correct +=(pred.argmax(1) == y).type(torch.float).sum().item()            a = (pred.argmax(1)==y)            b = (pred.argmax(1)==y).type(torch.float)    test_loss /=num_batches    correct /= size    print(f'test result: \n Accuracy: {(100*correct)}%, Avg loss:{test_loss}')#train(train_dataloader,model,loss_fn,optimizer)test(test_dataloader,model,loss_fn)#e = 30for i in range(e):    print(f'e: {i+1}\n------------------')    train(train_dataloader, model, loss_fn, optimizer)print('done')test(test_dataloader, model, loss_fn)
复制代码
运行结果:


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 qidao123.com技术社区-IT企服评测·应用市场 (https://dis.qidao123.com/) Powered by Discuz! X3.4