PyCharm入门学习笔记(三)神经网络的基本骨架torch.nn

本文详细介绍了卷积神经网络(CNN)的基本架构,包括输入层、卷积层、池化层、全连接层以及经典的网络架构如AlexNet、VGG和ResNet。此外,还讨论了卷积层的关键参数,如卷积核大小、步长和填充,并展示了如何在PyTorch中使用nn.Module、nn.Conv2d等构建和应用CNN。同时,提到了非线性激活函数、线性层、Sequential层、损失函数和优化器在模型训练中的作用。

一、神经网络(Neural network)架构torch.nn

1.1 神经网络架构

在这里插入图片描述

1.2 卷积神经网络

1.2.1 介绍

  1. 卷积神经网络(CNN)应用于计算机视觉领域,特征提取方法,任务:图像的分类和检索。
  2. GPU图像处理单元:GPU做卷积比CPU快得多
  3. 卷积网络与传统神经网络区别:数据二维->三维
  4. 整体架构:
    在这里插入图片描述

1.2.2 输入层

1.2.3 卷积层

  1. 卷积的任务:图像分割成很多部分,对于不同区域提取出不同特征,经过卷积核计算,计算出每个区域的特征值,将5×5×5-> 3×3×3,卷积可做多次
    在这里插入图片描述

  2. 图像颜色通道:3个颜色通道R G B做加法
    在这里插入图片描述

  3. 输入与不同的卷积核Filter Wi做内积得到的结果不同,一般做完卷积会加上一个偏置参数bias(下图对应:in_channel=3,out_channel=2,卷积核个数/大小为2/3×3,第一/二个bias为1/0)
    在这里插入图片描述

  4. 卷积层一些参数:
    1)滑动窗口步长:不同步长得到的输出不同,一般来说步长越小精度越高,但效率会变慢,一般选择1
    2)卷积核尺寸:Filter Wi的尺寸,一般选择3×3
    3)边缘填充:往上数第二图的输入的图,边界的点被计算的次数少,显然不公平。于是在边界点外侧再填充一些点(灰色部分0)
    4)卷积核个数(n):Filter Wi i=0,1…,n-1。要想得到多个特征图,需要设置不同的卷积核。
    例:11×11 fileters at stride 4 pade 0表示卷积核尺寸11×11,步长2,填充0
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

1.2.4 池化层:压缩 筛选

在这里插入图片描述
在这里插入图片描述

1.2.5 全连接层:卷积层和池化层只做特征提取,全连接层将一个图拉成特征向量

例如:
32×32×10->[10240,5]
带参数计算的才算做一层,卷积(CONV计算) 激活(RELU无计算) 池化(POOL无计算) 全连接(FC计算),所以以下7层神经网络。
在这里插入图片描述
在这里插入图片描述

1.2.6 经典的架构:

  1. 12年Alexnet:8层
    在这里插入图片描述

  2. 14年Vgg:16/19层,且卷积核3×3,经过maxpolling损失的信息在下一步弥补起来
    在这里插入图片描述

  3. 15年Resnet:按理说层数越高效果越好,但是实际并不是这样。于是,提出“同等映射”,在堆叠过程中得到F(x)如果表现不好将F(x)变为0,再在下一步加上原来的同等映射x,即F(x)+x
    在这里插入图片描述
    在这里插入图片描述

1.2.7 感受野:越大越好

在这里插入图片描述
在这里插入图片描述

二、各层的使用

2.1 容器Containers:nn.Module

import torch
from torch import nn
class Mywork(nn.Module):
    # 可以使用alt+insert重写/实现方法
    def __init__(self):
        super().__init__()

    # 前向传播
    def forward(self, input):
        output = input + 1
        return output
mywork = Mywork()
x = torch.tensor(1.0)
output = mywork(x)
print(output)
输出:
tensor(2.)

2.2 卷积层Convolution Layers:nn.conv2d

  1. 代码演示
import torch
import torchvision.datasets
from torch import nn
from torch.nn import Conv2d
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter

# 演示卷积层
# 进过卷积操作:64×3×32×32-》64×6×30×30
# 最后因为6通道无法输出,需要变成3通道:64×6×30×30-》128×3×30×30

dataset = torchvision.datasets.CIFAR10("./dataset", train=False,
                                       transform=torchvision.transforms.ToTensor(), download=True)
# 一次取64张图片
dataloader = DataLoader(dataset, batch_size=64)


class Mydata(nn.Module):
    def __init__(self):
        super(Mydata, self).__init__()
        # 卷积设置:输入通道为3,输出通道为6,卷积核大小3×3,步数为1,不填充
        self.conv1 = Conv2d(in_channels=3, out_channels=6, kernel_size=3, stride=1, padding=0)

    def forward(self, x):
        x = self.conv1(x)
        return x


mydata = Mydata()
step = 0
writer = SummaryWriter("logs")
for data in dataloader:
    imgs, targets = data
    output = mydata(imgs)
    # torch.Size([64, 3, 32, 32])
    # torch.Size([64, 6, 30, 30])
    # 可知输入64×3×32×32-》64×6×32×32  (数量,通道,图长,图宽)
    print(imgs.shape)
    print(output.shape)

    writer.add_images("inputImage", imgs, step)
    # 这里64×6×30×30无法直接输出,需要变成 yyy×3×30×30
    # 下面参数-1表示未知,经过计算可得出为128
    output = torch.reshape(output, (-1, 3, 30, 30))
    writer.add_images("outputImage", output, step)
    step = step + 1

writer.close()
  1. 结果展示:可以看出经过卷积操作图片的变化

在这里插入图片描述

2.3 填充层Padding Layers

2.4 池化层Pooling Layers

  1. 代码演示
import torchvision.datasets
from torch import nn
from torch.nn import MaxPool2d
from torch.utils.</
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值