人工智能学习PyTorch教程之层和块

我会详细讲解“人工智能学习PyTorch教程之层和块”的完整攻略。本文将包含以下内容:

  1. PyTorch中的层和块
  2. 利用层和块实现一个简单的神经网络分类器
  3. 利用层和块实现一个深度神经网络分类器

1. PyTorch中的层和块

在PyTorch中,层和块是用来构建神经网络的基本组成单元。层是指网络中相对比较简单的计算模块,如全连接层、卷积层、池化层、激活函数等;而块则是指由多个层组成的较复杂的计算模块,如ResNet中的基本块。

PyTorch中内置了许多常用的层和块,比如nn.Linear、nn.Conv2d、nn.BatchNorm2d等,我们可以通过继承nn.Module来自定义自己的层和块。

2. 利用层和块实现一个简单的神经网络分类器

接下来,我们将通过一个简单的例子来演示如何使用PyTorch中的层和块来实现一个简单的神经网络分类器。该分类器由三个全连接层组成,输入的特征向量为784维,输出为10个类别。

首先,我们需要定义一个继承于nn.Module的类,来实现自己的神经网络模型。代码如下:

import torch.nn as nn

class Classifier(nn.Module):
    def __init__(self):
        super(Classifier, self).__init__()
        self.fc1 = nn.Linear(784, 256)
        self.fc2 = nn.Linear(256, 128)
        self.fc3 = nn.Linear(128, 10)

    def forward(self, x):
        x = x.view(-1, 784)
        x = nn.functional.relu(self.fc1(x))
        x = nn.functional.relu(self.fc2(x))
        x = self.fc3(x)
        return x

上述代码中,我们定义了一个名为Classifier的类,继承于nn.Module。在构造函数中,我们定义了三个全连接层(fc1、fc2、fc3),分别将输入的784维特征映射到256、128、10维的输出。在forward函数中,我们将输入的形状转换为(batch_size, 784),并通过relu激活函数进行非线性变换。最后一层不需要激活函数。

接下来,我们需要准备数据集,并进行模型训练。这里我们将使用MNIST手写数字数据集,代码如下:

import torch
import torchvision.datasets as dsets
import torchvision.transforms as transforms

train_dataset = dsets.MNIST(root='./data/',
                            train=True, 
                            transform=transforms.ToTensor(),
                            download=True)

test_dataset = dsets.MNIST(root='./data/',
                           train=False, 
                           transform=transforms.ToTensor())

train_loader = torch.utils.data.DataLoader(dataset=train_dataset,
                                           batch_size=100, 
                                           shuffle=True)

test_loader = torch.utils.data.DataLoader(dataset=test_dataset,
                                          batch_size=100, 
                                          shuffle=False)

classifier = Classifier()
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(classifier.parameters(), lr=0.1)

num_epochs = 10
total_step = len(train_loader)

for epoch in range(num_epochs):
    for i, (images, labels) in enumerate(train_loader):
        outputs = classifier(images)
        loss = criterion(outputs, labels)
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        if (i+1) % 100 == 0:
            print ('Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}' 
                   .format(epoch+1, num_epochs, i+1, total_step, loss.item()))

with torch.no_grad():
    correct = 0
    total = 0
    for images, labels in test_loader:
        outputs = classifier(images)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

    print('Test Accuracy of the model on the 10000 test images: {} %'.format(100 * correct / total))

上述代码中,我们首先定义了训练和测试数据集,并通过DataLoader进行数据读取和批次处理。接着,我们定义了分类器、损失函数和优化器。在每个epoch中,我们将训练集的每个batch都带入模型进行训练,并在训练过程中输出损失值。最终,我们将测试集输入模型,计算分类准确率。

3. 利用层和块实现一个深度神经网络分类器

现在,我们来尝试使用PyTorch的块来实现一个更深的神经网络分类器。我们将使用全连接层和BatchNorm层构建一个四层的神经网络,并使用ResNet的基本块来构建一个八层的神经网络。

首先,我们来看一下四层神经网络的代码:

class DeepClassifier(nn.Module):
    def __init__(self):
        super(DeepClassifier, self).__init__()
        self.fc1 = nn.Linear(784, 256)
        self.bn1 = nn.BatchNorm1d(256)
        self.fc2 = nn.Linear(256, 128)
        self.bn2 = nn.BatchNorm1d(128)
        self.fc3 = nn.Linear(128, 64)
        self.bn3 = nn.BatchNorm1d(64)
        self.fc4 = nn.Linear(64, 10)

    def forward(self, x):
        x = x.view(-1, 784)
        x = nn.functional.relu(self.bn1(self.fc1(x)))
        x = nn.functional.relu(self.bn2(self.fc2(x)))
        x = nn.functional.relu(self.bn3(self.fc3(x)))
        x = self.fc4(x)
        return x

上述代码中,我们依然定义了四个全连接层,但是在每个全连接层后面都添加了BatchNorm层。在forward函数中,我们先进行形状转换,然后依次带入四个全连接层和BatchNorm层中。最后一层不需要BatchNorm。

接着,我们来看一下八层神经网络的代码:

class ResBlock(nn.Module):
    def __init__(self, in_channels, out_channels, stride=1):
        super(ResBlock, self).__init__()
        self.conv1 = nn.Conv2d(in_channels, out_channels, kernel_size=3, stride=stride, padding=1, bias=False)
        self.bn1 = nn.BatchNorm2d(out_channels)
        self.conv2 = nn.Conv2d(out_channels, out_channels, kernel_size=3, stride=1, padding=1, bias=False)
        self.bn2 = nn.BatchNorm2d(out_channels)

        self.shortcut = nn.Sequential()
        if stride != 1 or in_channels != out_channels:
            self.shortcut = nn.Sequential(
                nn.Conv2d(in_channels, out_channels, kernel_size=1, stride=stride, bias=False),
                nn.BatchNorm2d(out_channels)
            )

    def forward(self, x):
        out = nn.functional.relu(self.bn1(self.conv1(x)))
        out = self.bn2(self.conv2(out))
        out += self.shortcut(x)
        out = nn.functional.relu(out)
        return out

class DeepResClassifier(nn.Module):
    def __init__(self):
        super(DeepResClassifier, self).__init__()
        self.conv1 = nn.Conv2d(1, 16, kernel_size=3, stride=1, padding=1, bias=False)
        self.bn1 = nn.BatchNorm2d(16)
        self.layer1 = self._make_layer(16, 32, 2)
        self.layer2 = self._make_layer(32, 64, 2)
        self.avgpool = nn.AdaptiveAvgPool2d((1, 1))
        self.fc = nn.Linear(64, 10)

    def _make_layer(self, in_channels, out_channels, stride):
        layers = []
        layers.append(ResBlock(in_channels, out_channels, stride))
        for i in range(1, 2):
            layers.append(ResBlock(out_channels, out_channels))
        return nn.Sequential(*layers)

    def forward(self, x):
        x = self.bn1(self.conv1(x))
        x = nn.functional.relu(x)
        x = self.layer1(x)
        x = self.layer2(x)
        x = self.avgpool(x)
        x = x.view(x.size(0), -1)
        x = self.fc(x)
        return x

上述代码中,我们定义了一个名为ResBlock的类,用来实现ResNet的基本块。在构造函数中,我们定义了两个卷积层和BatchNorm层,并使用shortcut连接实现跨层连接。在forward函数中,我们首先进行卷积层和BatchNorm层的计算,然后分别对输出和shortcut进行相加和非线性变换操作。

然后,我们定义了一个名为DeepResClassifier的类,用来构建一个八层的神经网络。在构造函数中,我们定义了首层的卷积层和BatchNorm层,中间两层使用ResBlock实现跨层连接,最后一层使用全局平均池化和全连接层实现分类任务。

最后,我们参照前例利用数据集和优化器,带入模型进行训练即可。

至此,我们讲解完了“人工智能学习PyTorch教程之层和块”的完整攻略,其中包括了两个基本示例和代码实现。希望能对你的学习有所帮助!

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:人工智能学习PyTorch教程之层和块 - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • CNN tflearn处理mnist图像识别代码解说——conv_2d参数解释,整个网络的训练,主要就是为了学那个卷积核啊。

    官方参数解释: tflearn.layers.conv.conv_2d (incoming, nb_filter, filter_size, strides=1, padding=’same’, activation=’linear’, bias=True, weights_init=’uniform_scaling’, bias_init=’zeros’,…

    2023年4月8日
    00
  • Resnest:注意力+分组卷积的融合

    ResNeSt是亚马逊的李沐团队的paper,最近在各个任务上刷榜了,但却被ECCV2020 strong reject了,在知乎上也是引起了热议,据李沐说这个网络花了一百万刀!我看完 以后感觉是ResNeXt +  SKNet的组合,训练网络的很多tricks在工程上还是很有意义 的。 讨论:https://www.zhihu.com/question/3…

    2023年4月7日
    00
  • 学习笔记TF027:卷积神经网络

    卷积神经网络(Convolutional Neural Network,CNN),可以解决图像识别、时间序列信息问题。深度学习之前,借助SIFT、HoG等算法提取特征,集合SVM等机器学习算法识别图像。 SIFT,缩放、平移、旋转、视角转变、亮度调整畸变的一定程度内,具有不变性。有局限性,ImageNet ILSVRC比赛最好结果错误率在26%以上,常年难以…

    卷积神经网络 2023年4月8日
    00
  • 序列卷积:线性、周期和圆周

    线性卷积   线性卷积公式为$y(n)=x_1(n) \ast x_2(n)= \sum_{m=-\infty}^{\infty} x_1(m)x_2(n-m) = \sum_{m=-\infty}^{\infty} x_2(m)x_1(n-m)$。   卷积的过程可以理解为其中一个序列关于Y轴翻褶,然后不断移位,同时与另外一个序列进行相乘。   周期卷积 …

    2023年4月8日
    00
  • 卷积操作的线性性质

    (离散)卷积操作其实是仿射变换的一种: 对输入向量进行线性变换, 再加一个bias. 是一种线性变换. 它本身也满足线性函数的定义. 它可以被写成矩阵乘法形式. 以下图的卷积操作为例:若将\(3\times 3\)的卷积核与\(4\times 4\)的输入都按行优先展开为一维列向量. 则定义在它们之上的卷积操作可以写为矩阵\(C\)与向量\(x\)的乘法. …

    2023年4月8日
    00
  • 卷积神经网络2 tensorflow学习笔记五:mnist实例–卷积神经网络(CNN)

      mnist的卷积神经网络例子和上一篇博文中的神经网络例子大部分是相同的。但是CNN层数要多一些,网络模型需要自己来构建。 程序比较复杂,我就分成几个部分来叙述。 首先,下载并加载数据: import tensorflow as tf import tensorflow.examples.tutorials.mnist.input_data as inpu…

    卷积神经网络 2023年4月6日
    00
  • 卷积、卷积核的维数、尺寸

      最近看论文的时候,接触到了3-D卷积的知识,在找的过程中,发现“卷积、卷积核的维数、尺寸”这篇文章写的较详细,就搬运了过来,只是为了以后查找方便。 注:如果原作者看到,如果觉得不妥,我可以马上删掉这篇文章!!!

    卷积神经网络 2023年4月8日
    00
  • 【零基础学会LTE】【4】LTE 36.212 咬尾卷积码译码

    //本文均属原创,转载请注明出处。 //本课程以36.212 v10.4.0为教材,请自行到3GPP网站下载。 //由于保密的原因,暂不提供代码查看。   模块作用:对咬尾卷积码进行译码。 相关模块:咬尾卷积码编码,阅读本节之前请阅读编码节。 模块优缺点: 适用范围: 对应章节:   本节主要介绍咬尾卷积码的译码,关于咬尾卷积码的译码方法很多,这里我只介绍最…

    卷积神经网络 2023年4月6日
    00
合作推广
合作推广
分享本页
返回顶部