人工智能学习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教程之层和块”的完整攻略,其中包括了两个基本示例和代码实现。希望能对你的学习有所帮助!

阅读剩余 74%

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

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

相关文章

  • 反卷积(Transposed Convolution)

    反卷积的具体计算步骤 令图像为   卷积核为       case 1 如果要使输出的尺寸是 5×5,步数 stride=2 ,tensorflow 中的命令为: transpose_conv = tf.nn.conv2d_transpose(value=input, filter=kernel, output_shape=[1,5,5,1], stride…

    2023年4月8日
    00
  • 关于Tensorflow分布式并行策略

    下面我将为您详细讲解“关于Tensorflow分布式并行策略”的完整攻略,过程中会包含两条示例说明。 什么是TensorFlow分布式并行策略? 在单个设备上运行TensorFlow模型时,TensorFlow将模型的运算分配给单个CPU或GPU。在TensorFlow分布式并行策略中,TensorFlow使用多个设备来运行模型。这对于大型模型和数据集非常重…

    卷积神经网络 2023年5月15日
    00
  • 【零基础学会LTE】【3】LTE 36.212 咬尾卷积码详解

    //本文均属原创,转载请注明出处。 //本课程以36.212 v10.4.0为教材,请自行到3GPP网站下载。 //由于保密的原因,暂不提供代码查看。   模块作用:对控制信息和广播信道进行信道编码,增强鲁棒性。 相关模块:速率匹配 咬尾卷积码优缺点:克服了码率损失的问题,并且适合迭代译码,但是译码复杂度增加了。   本文主要介绍咬尾卷积码,协议上(v10.…

    2023年4月6日
    00
  • Tensorflow学习练习-卷积神经网络应用于手写数字数据集训练

    # coding: utf-8   import tensorflow as tffrom tensorflow.examples.tutorials.mnist import input_data mnist = input_data.read_data_sets(“F:\TensorflowProject\MNIST_data”,one_hot=True…

    卷积神经网络 2023年4月7日
    00
  • 卷积神经网络的卷积核大小、个数,卷积层数如何确定呢?

    转载TonySure 最后发布于2019-07-08 09:47:19 阅读数 7521  收藏   https://yq.aliyun.com/articles/610509   卷积神经网络的卷积核大小、卷积层数、每层map个数都是如何确定下来的呢?看到有些答案是刚开始随机初始化卷积核大小,卷积层数和map个数是根据经验来设定的,但这个里面应该是有深层次…

    2023年4月6日
    00
  • pytorch group 分组卷积

    https://www.jianshu.com/p/20ba3d8f283c

    卷积神经网络 2023年4月5日
    00
  • 卷积神经网络笔记

      卷积神经网络系统结构 PS:在池化层和全链接层之间可以加入多个卷积、激活、池化层       1、CONV:卷积层,用卷积核对输入图像进行卷积处理   2、RELU:激活层,将负值归零 3、池化层:有损压缩,减小图片尺寸    输入带标签的训练数据之后,卷积神经网络会根据输出与训练标签的误差反向调整自身的参数(卷积核和全连接层的W矩阵),因此卷积神经网络…

    2023年4月6日
    00
  • UFLDL之卷积与池化

    参考资料:[UFLDL教(http://ufldl.stanford.edu/wiki/index.php/UFLDL教程)及tornadomeet的博客个人代码:github地址 卷积与池化 卷积 当输入数据的特征数很大时,若特征层每个神经元都和所有特征相连,则需要非常多的参数。例如96*96的图像,学习100个特征,则有近1,000,000个参数需要学习…

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