<从零开始pytorch>:04-torch卷积神经网络搭建(巨详细总结)

构建卷积神经网络

  • 卷积神经网络中的输入层与传统的神经网络有些区别,需要重新设计,训练模块基本一致

1.读取数据

1.dataset --> DataLoader构建batch数据
    - 既然是构建batch数据,故需要batch_size参数

2.搭建模型

 - 1.是个类
 - 2.定义__init__()函数
     - 1.继承父类
     - 2.定义用到的层 self.XXX = XXX 格式
 - 3.forward(self,x)函数中调用__init__()函数中定义好的层
     - 这个x指的是输入的数据

3.用数据和定义好的模型进行训练

- 0.训练需要实例化定义好的模型
- 1.获取到加载好的数据
- 2.定义好的模型中传入数据,获得结果
- 3.用得到的结果和真实值比较,可以得到损失值和准确率
- 4.反向传播,优化器进行梯度更新
# 导包
import torch
import torch.nn as nn
import torch.optim as optim
import torch.nn.functional as F
from torchvision import datasets,transforms
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline

1.读取数据

  • 分别构建训练集和测试集(验证集)
  • 使用DataLoader来迭代获取数据
# 定义超参数
input_size = 28 # 图像大小:28 * 28
num_classes = 10 # 标签的种类
num_epochs = 3 # 迭代的次数
batch_size = 64 # 每个批次的大小,即每64章图片一块进行一次训练

# 加载训练集
train_dataset = datasets.MNIST(
                                root='./data',
                                train=True,
                                transform=transforms.ToTensor(),
                                download=True
                                )
# 记载测试集
test_dataset = datasets.MNIST(root='./data',
                             train=False,
                             transform=transforms.ToTensor())
# 构建batch数据
train_loader = torch.utils.data.DataLoader(dataset=train_dataset,
                                          batch_size=batch_size,
                                          shuffle=True)
test_loader = torch.utils.data.DataLoader(dataset=test_dataset,
                                         batch_size=batch_size,
                                         )

2.搭建卷积神经网络模型

class CNN(nn.Module):
    def __init__(self):
        super(CNN,self).__init__()
        
        self.conv1 = nn.Sequential(    # 输入大小 (1,28,28)
            nn.Conv2d(
                in_channels=1,         # 说明是灰度图
                out_channels=16,       # 要得到多少个特征图
                kernel_size=5,         # 卷积核的大小
                stride=1,              # 步长
                padding=2),            # 边缘填充的大小
            nn.ReLU
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,第4关的任务是使用pytorch搭建卷积神经网络来识别手写数字。这个任务需要掌握pytorch的基本操作和卷积神经网络的原理,同时需要对手写数字数据集有一定的了解。通过这个任务,可以深入理解卷积神经网络在图像识别中的应用。 ### 回答2: 随着机器学习和人工智能技术的发展,卷积神经网络成为了图像识别领域的重要工具。PyTorch是流行的深度学习框架之一,可以方便地搭建神经网络模型,特别是卷积神经网络模型。 搭建卷积神经网络识别手写数字的步骤如下: 一、准备数据 我们需要手写数字的数据集,可以使用MNIST数据集,该数据集包括60,000个训练图像和10,000个测试图像。 二、定义模型 我们可以使用PyTorch提供的nn模块定义卷积神经网络模型。其中包括卷积层、池化层和全连接层等,还有激活函数、批量归一化等常见的组件。 三、训练模型 我们需要选择优化算法,例如随机梯度下降(SGD)、Adam等,然后根据训练数据进行训练。这个过程中需要定义损失函数,例如交叉熵损失函数。 四、测试模型 我们可以使用测试数据进行模型测试,计算分类准确率等指标。 代码演示: 以下是一个简单的卷积神经网络的代码示例,用于识别手写数字: ```python import torch import torch.nn as nn import torch.utils.data as Data import torchvision from torchvision import transforms # 定义数据处理方式 transform = transforms.Compose([ transforms.ToTensor(), # 将图片转换为Tensor transforms.Normalize((0.1307,), (0.3081,)) # 标准化 ]) # 准备数据集 train_set = torchvision.datasets.MNIST( root='./data/', train=True, transform=transform, download=True ) train_loader = Data.DataLoader( dataset=train_set, batch_size=64, shuffle=True ) test_set = torchvision.datasets.MNIST( root='./data/', train=False, transform=transform, download=True ) test_loader = Data.DataLoader( dataset=test_set, batch_size=64, shuffle=True ) # 定义卷积神经网络模型 class CNN(nn.Module): def __init__(self): super(CNN, self).__init__() self.conv1 = nn.Conv2d(1, 32, 3, 1, padding=1) self.conv2 = nn.Conv2d(32, 64, 3, 1, padding=1) self.dropout1 = nn.Dropout2d(0.25) self.dropout2 = nn.Dropout2d(0.5) self.fc1 = nn.Linear(64 * 7 * 7, 128) self.fc2 = nn.Linear(128, 10) def forward(self, x): x = self.conv1(x) x = nn.functional.relu(x) x = self.conv2(x) x = nn.functional.relu(x) x = nn.functional.max_pool2d(x, 2) x = self.dropout1(x) x = torch.flatten(x, 1) x = self.fc1(x) x = nn.functional.relu(x) x = self.dropout2(x) x = self.fc2(x) return nn.functional.log_softmax(x, dim=1) # 定义模型和训练参数 model = CNN() optimizer = torch.optim.Adam(model.parameters(), lr=0.01) criterion = nn.CrossEntropyLoss() # 训练模型 for epoch in range(10): model.train() for batch_idx, (data, target) in enumerate(train_loader): optimizer.zero_grad() output = model(data) loss = criterion(output, target) loss.backward() optimizer.step() # 测试模型 model.eval() test_loss = 0 correct = 0 with torch.no_grad(): for data, target in test_loader: output = model(data) test_loss += criterion(output, target).item() pred = output.argmax(dim=1, keepdim=True) correct += pred.eq(target.view_as(pred)).sum().item() test_loss /= len(test_loader.dataset) print('Epoch {} Test set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)'.format( epoch, test_loss, correct, len(test_loader.dataset), 100. * correct / len(test_loader.dataset))) ``` 这段代码定义了一个简单的卷积神经网络模型,包括两个卷积层、两个池化层和两个全连接层。训练10个epoch后,输出测试集的平均损失和分类准确率。 以上便是使用PyTorch搭建卷积神经网络识别手写数字的简要步骤和代码示例。 ### 回答3: 卷积神经网络是一种广泛应用于图像识别和自然语言处理等领域的深度学习模型。而PyTorch是一个非常优秀的深度学习框架,可以方便地实现卷积神经网络。在本题中,我们将使用PyTorch搭建卷积神经网络来识别手写数字。 在使用PyTorch搭建卷积神经网络之前,需要先导入需要的库。这里我们需要导入torchtorchvision和numpy三个库。其中,torchPyTorch的核心库,torchvision是一些通用的视觉工具集,numpy是Python中处理矩阵和数组的库。导入完成后,我们需要先定义一个卷积神经网络的类,这里我们命名为Net。 Net类中包括了网络的初始化、前向传播、训练和测试四个部分。在初始化中,我们定义了一些卷积层、池化层、全连接层、Dropout层和Batch Normalization层。这些层将构成我们的卷积神经网络。在前向传播中,我们定义了整个网络的逻辑。在训练和测试中,我们使用了PyTorch提供的优化器和损失函数来进行训练和测试。 在搭建卷积神经网络之后,我们需要准备手写数字数据集,并进行数据的预处理。这里我们使用了MNIST数据集,该数据集包含了一些手写数字的图像数据,每个图像对应一个数字标签。我们使用torchvision中的transforms来对数据进行预处理。预处理的步骤包括将图像转换为PyTorch张量、将像素点的值归一化等。最终我们得到了训练集和测试集两个数据集。 接着,我们需要将数据集输入到卷积神经网络中进行训练和测试。在训练过程中,我们按照批次对数据进行处理,然后将处理后的数据输入到网络中进行训练。在每个批次中,我们会计算模型的损失值,并使用PyTorch提供的优化器来更新网络中的参数。训练过程中,我们还会记录下网络的准确率和损失值等指标。在测试过程中,我们只需要将测试集输入到网络中,然后进行预测即可。最终,我们可以通过输出网络的预测结果来测试模型的准确率。 总的来说,使用PyTorch搭建卷积神经网络识别手写数字的过程包括了数据准备、网络搭建、训练和测试四个步骤。通过不断调整网络中的参数和优化策略,我们可以得到一个表现良好的卷积神经网络来进行手写数字的识别任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值