PyTorch应用实战三:构建神经网络

简介: PyTorch应用实战三:构建神经网络

神经网络

构建神经网络的一般步骤如下:

  1. 确定网络的结构:这包括输入层、输出层和隐藏层的数量以及每层中的节点数等。
  2. 收集和准备数据:这包括收集训练数据、清洗数据、转换数据格式等。
  3. 初始化权重:权重是神经元之间的连接强度,需要在训练前随机初始化。
  1. 前向传播计算:根据输入数据和权重计算输出结果。
  2. 计算损失函数:损失函数衡量预测输出和真实输出之间的误差。
  3. 反向传播计算:反向传播是一种优化算法,用于调整权重以最小化损失函数。
  4. 更新权重:根据反向传播算法计算出的梯度更新权重,以优化模型。
  5. 重复以上步骤:反复执行前向传播和反向传播,调整权重,直到损失函数收敛。
  6. 测试和评估模型:使用测试数据集对模型进行评估和测试。
  1. 使用模型进行预测:使用已训练的模型对新数据进行预测。

1.继承Module构建神经网络

构建神经网络

import torch
import torch.nn as nn
from torch import optim
from torchvision import datasets, transforms
from torch.nn.functional import conv2d, cross_entropy 
class SimpleCNN(nn.Module):
    def __init__(self, in_channel=1):
        super(SimpleCNN, self).__init__()
        self.conv1 = nn.Conv2d(in_channel, 4, 5, 2, 0)
        self.relu1 = nn.ReLU()
        self.conv2 = nn.Conv2d(4, 8, 3, 2, 0)
        self.relu2 = nn.ReLU()
        self.linear = nn.Linear(200, 10)
    def forward(self, x):
        x = self.conv1(x)
        x = self.relu1(x)
        x = self.conv2(x)
        x = self.relu2(x)
        x = x.view(-1, 200)
        x = self.linear(x)
        return x

这个程序定义了一个简单的CNN模型 SimpleCNN,用于进行图像分类任务。它包含以下几个部分:

  1. 导入所需的 PyTorch 模块。这些模块是 torchnnoptimdatasetstransformsnn.functional
  1. 定义了一个名为 SimpleCNN 的类,继承了 nn.Module

__init__ 函数中定义模型的结构。这个模型包含两层卷积层和一个全连接层:

  • 第1层卷积层:输入通道数为 in_channel,输出通道数为 4,卷积核大小为 5x5,步长为 2,填充为 0。
  • 第1个ReLU激活函数:将卷积层的输出进行非线性变换。
  • 第2层卷积层:输入通道数为 4,输出通道数为 8,卷积核大小为 3x3,步长为 2,填充为 0。
  • 第2个ReLU激活函数:再次对卷积层的输出进行非线性变换。
  • 平铺层:将卷积层的输出展成一维向量。
  • 全连接层:输入大小为 200,输出大小为 10,用于输出分类结果。
  1. forward 函数中实现模型的前向传播过程。将输入 x 依次经过卷积层、ReLU激活函数、卷积层、ReLU激活函数和全连接层处理,最终输出分类结果。
#测试
model = SimpleCNN()
data = torch.randn(3, 1, 28, 28)
output = model(data)
output.shape
torch.Size([3, 10])

卷积层计算

(28-5)/2+1=12

(12-3)/2+1=5

3×1×28×28

3×4×12×12

3×8×5×5

3×200

3×10

神经网络模型

model
SimpleCNN(
  (conv1): Conv2d(1, 4, kernel_size=(5, 5), stride=(2, 2))
  (relu1): ReLU()
  (conv2): Conv2d(4, 8, kernel_size=(3, 3), stride=(2, 2))
  (relu2): ReLU()
  (linear): Linear(in_features=200, out_features=10, bias=True)
)
for key, value in model._modules.items():
    print(key, value)
conv1 Conv2d(1, 4, kernel_size=(5, 5), stride=(2, 2))
relu1 ReLU()
conv2 Conv2d(4, 8, kernel_size=(3, 3), stride=(2, 2))
relu2 ReLU()
linear Linear(in_features=200, out_features=10, bias=True)
model = SimpleCNN()
model.parameters()
for p in model.parameters():
    print(p.shape)
torch.Size([4, 1, 5, 5])
torch.Size([4])
torch.Size([8, 4, 3, 3])
torch.Size([8])
torch.Size([10, 200])
torch.Size([10])

导入数据集

train_batch_size = 100  #一共60000个数据,100个数据一组,一共600组(N=100)
test_batch_size = 100   #一共10000个数据,100个数据一组,一共100组(N=100)
# 训练集
train_loader = torch.utils.data.DataLoader(
    datasets.MNIST(
        './data',train=True,download=True,  
        transform=transforms.Compose([
            transforms.ToTensor(),  #转为tensor
            transforms.Normalize((0.5),(0.5)) #正则化
        ])
    ),
    batch_size = train_batch_size, shuffle=True  #打乱位置
)
# 测试集
test_loader = torch.utils.data.DataLoader(
    datasets.MNIST(
        './data',train=False,download=True,
        transform=transforms.Compose([
            transforms.ToTensor(),
            transforms.Normalize((0.5),(0.5))
        ])
    ),
    batch_size = test_batch_size, shuffle=False
)

这段代码主要用于加载 MNIST 数据集,并生成对应的数据加载器 train_loadertest_loader。具体包含以下几个步骤:

  1. 定义训练集的批次大小 train_batch_size,设为 100。
  2. 定义测试集的批次大小 test_batch_size,也设为 100。
  3. 调用 torch.utils.data.DataLoader 函数生成训练集加载器 train_loader,加载器将使用 datasets.MNIST 函数加载 MNIST 数据集,并进行以下操作:
  • 设置 MNIST 数据集的路径为 ./data
  • 将数据集设置为训练集,下载数据集。
  • 对数据进行transforms.Compose序列变换操作,包括:
  • transforms.ToTensor():将数据转为 Tensor 类型。
  • transforms.Normalize((0.5),(0.5)):将数据进行正则化。
  • 将训练集数据划分为大小为 train_batch_size 的批次,进行随机打乱。
  1. 调用 torch.utils.data.DataLoader 函数生成测试集加载器 test_loader,加载器将使用 datasets.MNIST 函数加载 MNIST 数据集,并进行相同的处理流程,但测试集不需要随机打乱。

这样生成的 train_loadertest_loader 可以用于对数据进行批量加载,方便后续的模型训练和评估。

训练测试

alpha = 0.1  #学习率
epochs = 100  #训练次数
interval = 100  #打印间隔
for epoch in range(epochs):
    optimizer = optim.SGD(model.parameters(), lr=0.1)
    for i, (data, label) in enumerate(train_loader):
        output = model(data)
        optimizer.zero_grad()  #梯度归零
        loss = cross_entropy(output, label)  #交叉熵函数
        loss.backward()   #反向求导
        optimizer.step()  #更新参数
        if i % interval == 0:
            print("Epoch %03d [%03d/%03d]\tLoss:%.4f"%(epoch, i, len(train_loader), loss.item()))
    correct_num = 0
    total_num = 0
    with torch.no_grad():
        for data, label in test_loader:
            output = model(data)
            pred = output.max(1)[1]
            correct_num += (pred == label).sum().item()
            total_num += len(data)
    acc = correct_num / total_num
    print('...Testing @ Epoch %03d\tAcc:%.4f'%(epoch, acc))
Epoch 000 [000/600] Loss:2.2848
Epoch 000 [100/600] Loss:0.4144
Epoch 000 [200/600] Loss:0.2014
Epoch 000 [300/600] Loss:0.2790
Epoch 000 [400/600] Loss:0.1858
Epoch 000 [500/600] Loss:0.1649
...Testing @ Epoch 000  Acc:0.9538
Epoch 001 [000/600] Loss:0.1593
Epoch 001 [100/600] Loss:0.2436
Epoch 001 [200/600] Loss:0.0649
Epoch 001 [300/600] Loss:0.2830
Epoch 001 [400/600] Loss:0.1208
Epoch 001 [500/600] Loss:0.0937
...Testing @ Epoch 001  Acc:0.9678
Epoch 002 [000/600] Loss:0.1210
Epoch 002 [100/600] Loss:0.0737
Epoch 002 [200/600] Loss:0.0857
Epoch 002 [300/600] Loss:0.0712
Epoch 002 [400/600] Loss:0.2700
Epoch 002 [500/600] Loss:0.0849
...Testing @ Epoch 002  Acc:0.9708
Epoch 003 [000/600] Loss:0.1094
Epoch 003 [100/600] Loss:0.0727
Epoch 003 [200/600] Loss:0.1756
Epoch 003 [300/600] Loss:0.1473
Epoch 003 [400/600] Loss:0.1013
Epoch 003 [500/600] Loss:0.0879
...Testing @ Epoch 003  Acc:0.9741
Epoch 004 [000/600] Loss:0.1503
Epoch 004 [100/600] Loss:0.0832
Epoch 004 [200/600] Loss:0.0731
Epoch 004 [300/600] Loss:0.1040
Epoch 004 [400/600] Loss:0.0720
Epoch 004 [500/600] Loss:0.0490
...Testing @ Epoch 004  Acc:0.9745
Epoch 005 [000/600] Loss:0.0720
Epoch 005 [100/600] Loss:0.1124
Epoch 005 [200/600] Loss:0.0674
Epoch 005 [300/600] Loss:0.0477
Epoch 005 [400/600] Loss:0.1164
Epoch 005 [500/600] Loss:0.0662
...Testing @ Epoch 005  Acc:0.9758
Epoch 006 [000/600] Loss:0.0445
Epoch 006 [100/600] Loss:0.0500
Epoch 006 [200/600] Loss:0.0236
Epoch 006 [300/600] Loss:0.1068
Epoch 006 [400/600] Loss:0.0767
Epoch 006 [500/600] Loss:0.0549
...Testing @ Epoch 006  Acc:0.9800
Epoch 007 [000/600] Loss:0.0539
Epoch 007 [100/600] Loss:0.0319
Epoch 007 [200/600] Loss:0.1369
Epoch 007 [300/600] Loss:0.0301
Epoch 007 [400/600] Loss:0.0881
Epoch 007 [500/600] Loss:0.0642
...Testing @ Epoch 007  Acc:0.9792
Epoch 008 [000/600] Loss:0.0564
Epoch 008 [100/600] Loss:0.0845
Epoch 008 [200/600] Loss:0.1877
Epoch 008 [300/600] Loss:0.0963
Epoch 008 [400/600] Loss:0.0671
Epoch 008 [500/600] Loss:0.1053
...Testing @ Epoch 008  Acc:0.9757
Epoch 009 [000/600] Loss:0.0117
Epoch 009 [100/600] Loss:0.0201
Epoch 009 [200/600] Loss:0.1933
Epoch 009 [300/600] Loss:0.0726
Epoch 009 [400/600] Loss:0.0449
Epoch 009 [500/600] Loss:0.1415
...Testing @ Epoch 009  Acc:0.9807
Epoch 010 [000/600] Loss:0.0505
Epoch 010 [100/600] Loss:0.0410
Epoch 010 [200/600] Loss:0.0325
Epoch 010 [300/600] Loss:0.0403
Epoch 010 [400/600] Loss:0.0249
Epoch 010 [500/600] Loss:0.0682
...Testing @ Epoch 010  Acc:0.9805
Epoch 011 [000/600] Loss:0.0816
Epoch 011 [100/600] Loss:0.1179
Epoch 011 [200/600] Loss:0.1244
Epoch 011 [300/600] Loss:0.0465
Epoch 011 [400/600] Loss:0.1324
Epoch 011 [500/600] Loss:0.0763
...Testing @ Epoch 011  Acc:0.9799
……

这段代码实现了简单 CNN 模型的训练和测试,具体实现步骤如下:

  1. 定义学习率 alpha,设为 0.1。
  2. 定义训练次数 epochs,设为 100。
  3. 定义打印间隔 interval,设为 100。
  4. 使用 range 函数循环 epochs 次,进行模型训练和测试。
  5. 在每个 epoch 循环中,定义优化器 optimizer,使用随机梯度下降法(SGD)优化器,对模型参数进行更新。
  6. 循环训练数据加载器 train_loader 中的数据,对数据进行前向传播,计算损失函数(交叉熵函数),通过反向传播求解梯度,并通过优化器对模型参数进行更新。
  7. 在每个间隔 interval 打印一次训练进度,输出当前训练的 epoch、批次、总批次数和当前损失函数值,以及测试集的准确率。
  8. 在每个 epoch 循环的末尾,使用 torch.no_grad() 防止梯度更新,在测试集加载器 test_loader 中进行数据的前向传播,计算模型的预测值和真实值,计算模型的准确率并输出。

这样就完成了模型的训练和测试,通过输出可以了解模型的训练进度和测试效果。

2.结构化构建神经网络

构建神经网络

Model = nn.Sequential(
    nn.Conv2d(1, 4, 5, 2, 0),
    nn.ReLU(),
    nn.Conv2d(4, 8, 3, 2, 0),
    nn.ReLU(),
    nn.Flatten(),
    nn.Linear(200, 10)
)

神经网络模型

Model
Sequential(
  (0): Conv2d(1, 4, kernel_size=(5, 5), stride=(2, 2))
  (1): ReLU()
  (2): Conv2d(4, 8, kernel_size=(3, 3), stride=(2, 2))
  (3): ReLU()
  (4): Flatten(start_dim=1, end_dim=-1)
  (5): Linear(in_features=200, out_features=10, bias=True)
)
#测试
data = torch.randn(3, 1, 28, 28)
output = Model(data)
output.shape
torch.Size([3, 10])
for p in Model.parameters():
    print(p.shape)
torch.Size([4, 1, 5, 5])
torch.Size([4])
torch.Size([8, 4, 3, 3])
torch.Size([8])
torch.Size([10, 200])
torch.Size([10])

训练测试

alpha = 0.1  #学习率
epochs = 100  #训练次数
interval = 100  #打印间隔
for epoch in range(epochs):
    optimizer = optim.SGD(Model.parameters(), lr=0.1)
    for i, (data, label) in enumerate(train_loader):
        output = Model(data)
        optimizer.zero_grad()  #梯度归零
        loss = cross_entropy(output, label)  #交叉熵函数
        loss.backward()   #反向求导
        optimizer.step()  #更新参数
        if i % interval == 0:
            print("Epoch %03d [%03d/%03d]\tLoss:%.4f"%(epoch, i, len(train_loader), loss.item()))
    correct_num = 0
    total_num = 0
    with torch.no_grad():
        for data, label in test_loader:
            output = Model(data)
            pred = output.max(1)[1]
            correct_num += (pred == label).sum().item()
            total_num += len(data)
    acc = correct_num / total_num
    print('...Testing @ Epoch %03d\tAcc:%.4f'%(epoch, acc))
Epoch 000 [000/600] Loss:2.3005
Epoch 000 [100/600] Loss:0.3855
Epoch 000 [200/600] Loss:0.2832
Epoch 000 [300/600] Loss:0.3216
Epoch 000 [400/600] Loss:0.2495
Epoch 000 [500/600] Loss:0.0687
...Testing @ Epoch 000  Acc:0.9554
Epoch 001 [000/600] Loss:0.1364
Epoch 001 [100/600] Loss:0.2104
Epoch 001 [200/600] Loss:0.1206
Epoch 001 [300/600] Loss:0.0859
Epoch 001 [400/600] Loss:0.1187
Epoch 001 [500/600] Loss:0.1903
...Testing @ Epoch 001  Acc:0.9668
Epoch 002 [000/600] Loss:0.1893
Epoch 002 [100/600] Loss:0.1033
Epoch 002 [200/600] Loss:0.1633
Epoch 002 [300/600] Loss:0.1038
Epoch 002 [400/600] Loss:0.1250
Epoch 002 [500/600] Loss:0.2345
...Testing @ Epoch 002  Acc:0.9725
Epoch 003 [000/600] Loss:0.0566
Epoch 003 [100/600] Loss:0.1781
Epoch 003 [200/600] Loss:0.0779
Epoch 003 [300/600] Loss:0.2852
Epoch 003 [400/600] Loss:0.0428
Epoch 003 [500/600] Loss:0.1369
...Testing @ Epoch 003  Acc:0.9714
Epoch 004 [000/600] Loss:0.1098
Epoch 004 [100/600] Loss:0.1288
Epoch 004 [200/600] Loss:0.1078
Epoch 004 [300/600] Loss:0.1325
Epoch 004 [400/600] Loss:0.0649
Epoch 004 [500/600] Loss:0.0683
...Testing @ Epoch 004  Acc:0.9739
Epoch 005 [000/600] Loss:0.0984
Epoch 005 [100/600] Loss:0.1322
Epoch 005 [200/600] Loss:0.0641
Epoch 005 [300/600] Loss:0.0769
Epoch 005 [400/600] Loss:0.1507
Epoch 005 [500/600] Loss:0.0377
...Testing @ Epoch 005  Acc:0.9742
Epoch 006 [000/600] Loss:0.0954
Epoch 006 [100/600] Loss:0.0889
Epoch 006 [200/600] Loss:0.0666
Epoch 006 [300/600] Loss:0.0448
Epoch 006 [400/600] Loss:0.0285
Epoch 006 [500/600] Loss:0.0581
...Testing @ Epoch 006  Acc:0.9773
Epoch 007 [000/600] Loss:0.0305
Epoch 007 [100/600] Loss:0.0651
Epoch 007 [200/600] Loss:0.1007
Epoch 007 [300/600] Loss:0.1537
Epoch 007 [400/600] Loss:0.0233
Epoch 007 [500/600] Loss:0.0925
...Testing @ Epoch 007  Acc:0.9750
Epoch 008 [000/600] Loss:0.1807
Epoch 008 [100/600] Loss:0.0373
Epoch 008 [200/600] Loss:0.0600
Epoch 008 [300/600] Loss:0.2233
Epoch 008 [400/600] Loss:0.0469
Epoch 008 [500/600] Loss:0.0817
...Testing @ Epoch 008  Acc:0.9795
Epoch 009 [000/600] Loss:0.1331
Epoch 009 [100/600] Loss:0.1417
Epoch 009 [200/600] Loss:0.0429
Epoch 009 [300/600] Loss:0.0552
Epoch 009 [400/600] Loss:0.0117
Epoch 009 [500/600] Loss:0.0611
...Testing @ Epoch 009  Acc:0.9780
Epoch 010 [000/600] Loss:0.0386
Epoch 010 [100/600] Loss:0.2372
Epoch 010 [200/600] Loss:0.0092
Epoch 010 [300/600] Loss:0.0623
Epoch 010 [400/600] Loss:0.0530
Epoch 010 [500/600] Loss:0.0345
...Testing @ Epoch 010  Acc:0.9797
Epoch 011 [000/600] Loss:0.1051
Epoch 011 [100/600] Loss:0.0507
Epoch 011 [200/600] Loss:0.1075
Epoch 011 [300/600] Loss:0.0414
Epoch 011 [400/600] Loss:0.0256
Epoch 011 [500/600] Loss:0.0631
...Testing @ Epoch 011  Acc:0.9778
Epoch 012 [000/600] Loss:0.0873
Epoch 012 [100/600] Loss:0.0693
Epoch 012 [200/600] Loss:0.0779
Epoch 012 [300/600] Loss:0.2842
Epoch 012 [400/600] Loss:0.0314
Epoch 012 [500/600] Loss:0.0197
...Testing @ Epoch 012  Acc:0.9778
……

3.函数式操作

见《PyTorch应用实战二:实现卷积神经网络进行图像分类》

目录
相关文章
|
2月前
|
机器学习/深度学习 PyTorch 算法框架/工具
目标检测实战(一):CIFAR10结合神经网络加载、训练、测试完整步骤
这篇文章介绍了如何使用PyTorch框架,结合CIFAR-10数据集,通过定义神经网络、损失函数和优化器,进行模型的训练和测试。
134 2
目标检测实战(一):CIFAR10结合神经网络加载、训练、测试完整步骤
|
2月前
|
机器学习/深度学习 数据采集 存储
时间序列预测新突破:深入解析循环神经网络(RNN)在金融数据分析中的应用
【10月更文挑战第7天】时间序列预测是数据科学领域的一个重要课题,特别是在金融行业中。准确的时间序列预测能够帮助投资者做出更明智的决策,比如股票价格预测、汇率变动预测等。近年来,随着深度学习技术的发展,尤其是循环神经网络(Recurrent Neural Networks, RNNs)及其变体如长短期记忆网络(LSTM)和门控循环单元(GRU),在处理时间序列数据方面展现出了巨大的潜力。本文将探讨RNN的基本概念,并通过具体的代码示例展示如何使用这些模型来进行金融数据分析。
344 2
|
2月前
|
机器学习/深度学习 人工智能 算法框架/工具
深度学习中的卷积神经网络(CNN)及其在图像识别中的应用
【10月更文挑战第7天】本文将深入探讨卷积神经网络(CNN)的基本原理,以及它如何在图像识别领域中大放异彩。我们将从CNN的核心组件出发,逐步解析其工作原理,并通过一个实际的代码示例,展示如何利用Python和深度学习框架实现一个简单的图像分类模型。文章旨在为初学者提供一个清晰的入门路径,同时为有经验的开发者提供一些深入理解的视角。
|
25天前
|
机器学习/深度学习 运维 安全
图神经网络在欺诈检测与蛋白质功能预测中的应用概述
金融交易网络与蛋白质结构的共同特点是它们无法通过简单的欧几里得空间模型来准确描述,而是需要复杂的图结构来捕捉实体间的交互模式。传统深度学习方法在处理这类数据时效果不佳,图神经网络(GNNs)因此成为解决此类问题的关键技术。GNNs通过消息传递机制,能有效提取图结构中的深层特征,适用于欺诈检测和蛋白质功能预测等复杂网络建模任务。
50 2
图神经网络在欺诈检测与蛋白质功能预测中的应用概述
|
21天前
|
机器学习/深度学习 自然语言处理 语音技术
Python在深度学习领域的应用,重点讲解了神经网络的基础概念、基本结构、训练过程及优化技巧
本文介绍了Python在深度学习领域的应用,重点讲解了神经网络的基础概念、基本结构、训练过程及优化技巧,并通过TensorFlow和PyTorch等库展示了实现神经网络的具体示例,涵盖图像识别、语音识别等多个应用场景。
44 8
|
24天前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习中的卷积神经网络(CNN)及其在图像识别中的应用
本文旨在通过深入浅出的方式,为读者揭示卷积神经网络(CNN)的神秘面纱,并展示其在图像识别领域的实际应用。我们将从CNN的基本概念出发,逐步深入到网络结构、工作原理以及训练过程,最后通过一个实际的代码示例,带领读者体验CNN的强大功能。无论你是深度学习的初学者,还是希望进一步了解CNN的专业人士,这篇文章都将为你提供有价值的信息和启发。
|
21天前
|
机器学习/深度学习 人工智能 自然语言处理
探索深度学习中的卷积神经网络(CNN)及其在现代应用中的革新
探索深度学习中的卷积神经网络(CNN)及其在现代应用中的革新
|
22天前
|
机器学习/深度学习 数据采集 算法
机器学习在医疗诊断中的前沿应用,包括神经网络、决策树和支持向量机等方法,及其在医学影像、疾病预测和基因数据分析中的具体应用
医疗诊断是医学的核心,其准确性和效率至关重要。本文探讨了机器学习在医疗诊断中的前沿应用,包括神经网络、决策树和支持向量机等方法,及其在医学影像、疾病预测和基因数据分析中的具体应用。文章还讨论了Python在构建机器学习模型中的作用,面临的挑战及应对策略,并展望了未来的发展趋势。
76 1
|
1月前
|
并行计算 监控 搜索推荐
使用 PyTorch-BigGraph 构建和部署大规模图嵌入的完整教程
当处理大规模图数据时,复杂性难以避免。PyTorch-BigGraph (PBG) 是一款专为此设计的工具,能够高效处理数十亿节点和边的图数据。PBG通过多GPU或节点无缝扩展,利用高效的分区技术,生成准确的嵌入表示,适用于社交网络、推荐系统和知识图谱等领域。本文详细介绍PBG的设置、训练和优化方法,涵盖环境配置、数据准备、模型训练、性能优化和实际应用案例,帮助读者高效处理大规模图数据。
48 5
|
29天前
|
机器学习/深度学习 人工智能 PyTorch
使用Pytorch构建视觉语言模型(VLM)
视觉语言模型(Vision Language Model,VLM)正在改变计算机对视觉和文本信息的理解与交互方式。本文将介绍 VLM 的核心组件和实现细节,可以让你全面掌握这项前沿技术。我们的目标是理解并实现能够通过指令微调来执行有用任务的视觉语言模型。
35 2

热门文章

最新文章