【Pytorch神经网络实战案例】10 搭建深度卷积神经网络

简介: 【Pytorch神经网络实战案例】10 搭建深度卷积神经网络

6eb9cb2dde3a4266948bfd6722d36161.png


 

识别黑白图中的服装图案(Fashion-MNIST)


https://blog.csdn.net/qq_39237205/article/details/123379997

基于上述代码修改模型的组成


1 修改myConNet模型


1.1.1 修改阐述


将模型中的两个全连接层,变为全局平均池化层。


1.1.2 修改结果


### 1.5 定义模型类
class myConNet(torch.nn.Module):
    def __init__(self):
        super(myConNet, self).__init__()
        # 定义卷积层
        self.conv1 = torch.nn.Conv2d(in_channels = 1 ,out_channels = 6,kernel_size = 3)
        self.conv2 = torch.nn.Conv2d(in_channels = 6,out_channels = 12,kernel_size = 3)
        self.conv3 = torch.nn.Conv2d(in_channels = 12, out_channels=10, kernel_size = 3) # 分为10个类
    def forward(self,t):
        # 第一层卷积和池化处理
        t = self.conv1(t)
        t = F.relu(t)
        t = F.max_pool2d(t, kernel_size=2, stride=2)
        # 第二层卷积和池化处理
        t = self.conv2(t)
        t = F.relu(t)
        t = F.max_pool2d(t, kernel_size=2, stride=2)
        # 第三层卷积和池化处理
        t = self.conv3(t)
        t = F.avg_pool2d(t,kernel_size = t.shape[-2:],stride = t.shape[-2:]) # 设置池化区域为输入数据的大小(最后两个维度),完成全局平均化的处理。
        return t.reshape(t.shape[:2])


2 代码


import  torchvision
import torchvision.transforms as transforms
import pylab
import torch
from matplotlib import pyplot as plt
import torch.utils.data
import torch.nn.functional as F
import numpy as np
import os
os.environ["KMP_DUPLICATE_LIB_OK"]="TRUE"
# 定义显示图像的函数
def imshow(img):
    print("图片形状",np.shape(img))
    img = img/2 +0.5
    npimg = img.numpy()
    plt.axis('off')
    plt.imshow(np.transpose(npimg,(1,2,0)))
### 1.1 自动下载FashionMNIST数据集
data_dir = './fashion_mnist' # 设置存放位置
transform = transforms.Compose([transforms.ToTensor()]) # 可以自动将图片转化为Pytorch支持的形状[通道,高,宽],同时也将图片的数值归一化
train_dataset = torchvision.datasets.FashionMNIST(data_dir,train=True,transform=transform,download=True)
print("训练集的条数",len(train_dataset))
### 1.2 读取及显示FashionMNIST数据集中的数据
val_dataset = torchvision.datasets.FashionMNIST(root=data_dir,train=False,transform=transform)
print("测试集的条数",len(val_dataset))
##1.2.1 显示数据集中的数据
im = train_dataset[0][0].numpy()
im = im.reshape(-1,28)
pylab.imshow(im)
pylab.show()
print("当前图片的标签为",train_dataset[0][1])
### 1.3 按批次封装FashionMNIST数据集
batch_size = 10 #设置批次大小
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
test_loader = torch.utils.data.DataLoader(val_dataset, batch_size=batch_size, shuffle=False)
### 1.4 读取批次数据集
## 定义类别名称
classes = ('T-shirt', 'Trouser', 'Pullover', 'Dress', 'Coat', 'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle_Boot')
sample = iter(train_loader) # 将数据集转化成迭代器
images,labels = sample.next() # 从迭代器中取得一批数据
print("样本形状",np.shape(images)) # 打印样本形状
# 输出 样本形状 torch.Size([10, 1, 28, 28])
print("样本标签",labels)
# 输出 图片形状 torch.Size([3, 32, 302])
imshow(torchvision.utils.make_grid(images,nrow = batch_size)) # 数据可视化:make_grid()将该批次的图片内容组合为一个图片,用于显示,nrow用于设置生成图片中每行的样本数量
print(','.join('%5s' % classes[labels[j]] for j in range(len(images))))
# 输出 Trouser,Trouser,Dress,  Bag,Shirt,Sandal,Shirt,Dress,  Bag,  Bag
### 1.5 定义模型类
class myConNet(torch.nn.Module):
    def __init__(self):
        super(myConNet, self).__init__()
        # 定义卷积层
        self.conv1 = torch.nn.Conv2d(in_channels = 1 ,out_channels = 6,kernel_size = 3)
        self.conv2 = torch.nn.Conv2d(in_channels = 6,out_channels = 12,kernel_size = 3)
        self.conv3 = torch.nn.Conv2d(in_channels = 12, out_channels=10, kernel_size = 3) # 分为10个类
    def forward(self,t):
        # 第一层卷积和池化处理
        t = self.conv1(t)
        t = F.relu(t)
        t = F.max_pool2d(t, kernel_size=2, stride=2)
        # 第二层卷积和池化处理
        t = self.conv2(t)
        t = F.relu(t)
        t = F.max_pool2d(t, kernel_size=2, stride=2)
        # 第三层卷积和池化处理
        t = self.conv3(t)
        t = F.avg_pool2d(t,kernel_size = t.shape[-2:],stride = t.shape[-2:]) # 设置池化区域为输入数据的大小(最后两个维度),完成全局平均化的处理。
        return t.reshape(t.shape[:2])
if __name__ == '__main__':
    network = myConNet() # 生成自定义模块的实例化对象
    #指定设备
    device = torch.device("cuda:0"if torch.cuda.is_available() else "cpu")
    print(device)
    network.to(device)
    print(network) # 打印myConNet网络
### 1.6 损失函数与优化器
    criterion = torch.nn.CrossEntropyLoss()  #实例化损失函数类
    optimizer = torch.optim.Adam(network.parameters(), lr=.01)
### 1.7 训练模型
    for epoch in range(2):  # 数据集迭代2次
        running_loss = 0.0
        for i, data in enumerate(train_loader, 0):  # 循环取出批次数据 使用enumerate()函数对循环计数,第二个参数为0,表示从0开始
            inputs, labels = data
            inputs, labels = inputs.to(device), labels.to(device)  #
            optimizer.zero_grad()  # 清空之前的梯度
            outputs = network(inputs)
            loss = criterion(outputs, labels)  # 计算损失
            loss.backward()  # 反向传播
            optimizer.step()  # 更新参数
            running_loss += loss.item()
            ### 训练过程的显示
            if i % 1000 == 999:
                print('[%d, %5d] loss: %.3f' %
                      (epoch + 1, i + 1, running_loss / 2000))
                running_loss = 0.0
    print('Finished Training')
### 1.8 保存模型
    torch.save(network.state_dict(),'./models/CNNFashionMNist.PTH')
### 1.9 加载模型,并且使用该模型进行预测
    network.load_state_dict(torch.load('./models/CNNFashionMNist.PTH')) # 加载模型
    # 使用模型
    dataiter = iter(test_loader) # 获取测试数据
    images, labels = dataiter.next()
    inputs, labels = images.to(device), labels.to(device)
    imshow(torchvision.utils.make_grid(images, nrow=batch_size)) # 取出一批数据进行展示
    print('真实标签: ', ' '.join('%5s' % classes[labels[j]] for j in range(len(images))))
    # 输出:真实标签:  Ankle_Boot Pullover Trouser Trouser Shirt Trouser  Coat Shirt Sandal Sneaker
    outputs = network(inputs) # 调用network对输入样本进行预测,得到测试结果outputs
    _, predicted = torch.max(outputs, 1) # 对于预测结果outputs沿着第1维度找出最大值及其索引值,该索引值即为预测的分类结果
    print('预测结果: ', ' '.join('%5s' % classes[predicted[j]] for j in range(len(images))))
    # 输出:预测结果:  Ankle_Boot Pullover Trouser Trouser Pullover Trouser Shirt Shirt Sandal Sneaker
### 1.10 评估模型
    # 测试模型
    class_correct = list(0. for i in range(10)) # 定义列表,收集每个类的正确个数
    class_total = list(0. for i in range(10)) # 定义列表,收集每个类的总个数
    with torch.no_grad():
        for data in test_loader: # 遍历测试数据集
            images, labels = data
            inputs, labels = images.to(device), labels.to(device)
            outputs = network(inputs) # 将每个批次的数据输入模型
            _, predicted = torch.max(outputs, 1) # 计算预测结果
            predicted = predicted.to(device)
            c = (predicted == labels).squeeze() # 统计正确的个数
            for i in range(10): # 遍历所有类别
                label = labels[i]
                class_correct[label] = class_correct[label] + c[i].item() # 若该类别正确则+1
                class_total[label] = class_total[label] + 1 # 根据标签中的类别,计算类的总数
    sumacc = 0
    for i in range(10): # 输出每个类的预测结果
        Accuracy = 100 * class_correct[i] / class_total[i]
        print('Accuracy of %5s : %2d %%' % (classes[i], Accuracy))
        sumacc = sumacc + Accuracy
    print('Accuracy of all : %2d %%' % (sumacc / 10.)) # 输出最终的准确率


输出:
Accuracy of T-shirt : 72 %
Accuracy of Trouser : 96 %
Accuracy of Pullover : 75 %
Accuracy of Dress : 72 %
Accuracy of  Coat : 75 %
Accuracy of Sandal : 90 %
Accuracy of Shirt : 35 %
Accuracy of Sneaker : 93 %
Accuracy of   Bag : 92 %
Accuracy of Ankle_Boot : 92 %
Accuracy of all : 79 %


目录
相关文章
|
11天前
|
机器学习/深度学习 API Python
Python 高级编程与实战:深入理解网络编程与异步IO
在前几篇文章中,我们探讨了 Python 的基础语法、面向对象编程、函数式编程、元编程、性能优化、调试技巧、数据科学、机器学习、Web 开发和 API 设计。本文将深入探讨 Python 在网络编程和异步IO中的应用,并通过实战项目帮助你掌握这些技术。
|
3月前
|
存储 安全 网络安全
网络安全的盾与剑:漏洞防御与加密技术的实战应用
在数字化浪潮中,网络安全成为保护信息资产的重中之重。本文将深入探讨网络安全的两个关键领域——安全漏洞的防御策略和加密技术的应用,通过具体案例分析常见的安全威胁,并提供实用的防护措施。同时,我们将展示如何利用Python编程语言实现简单的加密算法,增强读者的安全意识和技术能力。文章旨在为非专业读者提供一扇了解网络安全复杂世界的窗口,以及为专业人士提供可立即投入使用的技术参考。
|
3月前
|
存储 缓存 监控
Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
本文介绍了Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
308 7
|
18天前
|
机器学习/深度学习 算法 安全
用PyTorch从零构建 DeepSeek R1:模型架构和分步训练详解
本文详细介绍了DeepSeek R1模型的构建过程,涵盖从基础模型选型到多阶段训练流程,再到关键技术如强化学习、拒绝采样和知识蒸馏的应用。
177 3
用PyTorch从零构建 DeepSeek R1:模型架构和分步训练详解
|
2月前
|
机器学习/深度学习 搜索推荐 PyTorch
基于昇腾用PyTorch实现传统CTR模型WideDeep网络
本文介绍了如何在昇腾平台上使用PyTorch实现经典的WideDeep网络模型,以处理推荐系统中的点击率(CTR)预测问题。
237 66
|
3月前
|
机器学习/深度学习 人工智能 PyTorch
Transformer模型变长序列优化:解析PyTorch上的FlashAttention2与xFormers
本文探讨了Transformer模型中变长输入序列的优化策略,旨在解决深度学习中常见的计算效率问题。文章首先介绍了批处理变长输入的技术挑战,特别是填充方法导致的资源浪费。随后,提出了多种优化技术,包括动态填充、PyTorch NestedTensors、FlashAttention2和XFormers的memory_efficient_attention。这些技术通过减少冗余计算、优化内存管理和改进计算模式,显著提升了模型的性能。实验结果显示,使用FlashAttention2和无填充策略的组合可以将步骤时间减少至323毫秒,相比未优化版本提升了约2.5倍。
117 3
Transformer模型变长序列优化:解析PyTorch上的FlashAttention2与xFormers
|
5月前
|
算法 PyTorch 算法框架/工具
Pytorch学习笔记(九):Pytorch模型的FLOPs、模型参数量等信息输出(torchstat、thop、ptflops、torchsummary)
本文介绍了如何使用torchstat、thop、ptflops和torchsummary等工具来计算Pytorch模型的FLOPs、模型参数量等信息。
730 2
|
5月前
|
机器学习/深度学习 自然语言处理 监控
利用 PyTorch Lightning 搭建一个文本分类模型
利用 PyTorch Lightning 搭建一个文本分类模型
137 7
利用 PyTorch Lightning 搭建一个文本分类模型
|
5月前
|
机器学习/深度学习 自然语言处理 数据建模
三种Transformer模型中的注意力机制介绍及Pytorch实现:从自注意力到因果自注意力
本文深入探讨了Transformer模型中的三种关键注意力机制:自注意力、交叉注意力和因果自注意力,这些机制是GPT-4、Llama等大型语言模型的核心。文章不仅讲解了理论概念,还通过Python和PyTorch从零开始实现这些机制,帮助读者深入理解其内部工作原理。自注意力机制通过整合上下文信息增强了输入嵌入,多头注意力则通过多个并行的注意力头捕捉不同类型的依赖关系。交叉注意力则允许模型在两个不同输入序列间传递信息,适用于机器翻译和图像描述等任务。因果自注意力确保模型在生成文本时仅考虑先前的上下文,适用于解码器风格的模型。通过本文的详细解析和代码实现,读者可以全面掌握这些机制的应用潜力。
346 3
三种Transformer模型中的注意力机制介绍及Pytorch实现:从自注意力到因果自注意力
|
5月前
|
存储 并行计算 PyTorch
探索PyTorch:模型的定义和保存方法
探索PyTorch:模型的定义和保存方法

热门文章

最新文章