学习怎么写博客

1. net.py文件

  1. 这里面写python是为了告诉他我在写python代码。
#coding:utf8

# Copyright 2019 longpeng2008. All Rights Reserved.
# Licensed under the Apache License, Version 2.0 (the "License");
# If you find any problem,please contact us
#
#     [email protected] 
#
# or create issues
# =============================================================================
import torch
import torch.nn as nn
import torch.nn.functional as F
import numpy as np
from torchsummary import summary

## 3层卷积神经网络simpleconv3定义
## 包括3个卷积层,3个BN层,3个ReLU激活层,3个全连接层

class simpleconv3(nn.Module):
    ## 初始化函数
    def __init__(self,nclass):
        super(simpleconv3,self).__init__()
        self.conv1 = nn.Conv2d(3, 12, 3, 2) #输入图片大小为3*48*48,输出特征图大小为12*23*23,卷积核大小为3*3,步长为2
        self.bn1 = nn.BatchNorm2d(12)
        self.conv2 = nn.Conv2d(12, 24, 3, 2) #输入图片大小为12*23*23,输出特征图大小为24*11*11,卷积核大小为3*3,步长为2
        self.bn2 = nn.BatchNorm2d(24)
        self.conv3 = nn.Conv2d(24, 48, 3, 2) #输入图片大小为24*11*11,输出特征图大小为48*5*5,卷积核大小为3*3,步长为2
        self.bn3 = nn.BatchNorm2d(48)
        self.fc1 = nn.Linear(48 * 5 * 5 , 1200) #输入向量长为48*5*5=1200,输出向量长为1200
        self.fc2 = nn.Linear(1200 , 128) #输入向量长为1200,输出向量长为128
        self.fc3 = nn.Linear(128 , nclass) #输入向量长为128,输出向量长为nclass,等于类别数

    ## 前向函数
    def forward(self, x):
        ## relu函数,不需要进行实例化,直接进行调用
        ## conv,fc层需要调用nn.Module进行实例化
        x = F.relu(self.bn1(self.conv1(x)))
        x = F.relu(self.bn2(self.conv2(x)))
        x = F.relu(self.bn3(self.conv3(x)))
        x = x.view(-1 , 48 * 5 * 5) 
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x

if __name__ == '__main__':
    import torch
    x = torch.randn(1,3,48,48)
    model = simpleconv3(4)
    device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
    model.to(device)
    x = x.to(device)
    y = model(x)
    print(model)

    summary(model, (3, 48, 48))

2. net.py文件解析

*nn.BatchNormal2D(args)
nn.BatchNorm2d表示2D批量归一化(Batch Normalization)操作,用于加速深度神经网络的训练过程,并提高模型的泛化性能。这个操作可以对卷积层和全连接层的输出进行归一化处理,使得网络的输入分布更加稳定,减少了内部协变量位移(Internal Covariate Shift)问题,从而提高了模型的训练速度和泛化性能。

在这段代码中,nn.BatchNorm2d(24)表示对输入维度为24的2D特征图进行批量归一化操作。这个操作会将每个特征通道的输入归一化到均值为0,标准差为1的分布上,使得网络在训练过程中更加稳定,提高了模型的泛化能力。

为什么三个fc?
在深度学习中,卷积神经网络(Convolutional Neural Network, CNN)通常是由卷积层(Convolutional Layer)、激活层(Activation Layer)、池化层(Pooling Layer)和全连接层(Fully Connected Layer)等多种层组成。卷积层通过卷积操作提取图像中的特征,激活层通过对卷积层的输出进行非线性映射,池化层对卷积层输出进行降维,而全连接层则将卷积层和池化层提取的特征进行组合,并将最终的特征向量输入到softmax分类器进行分类。

在这段代码中,simpleconv3类包括3个卷积层、3个BN层、3个ReLU激活层和3个全连接层,其中3个全连接层(fc1, fc2, fc3)用于将卷积层和池化层提取的特征向量进行组合,并输出分类结果。第一个全连接层的输入向量长度为4855,输出向量长度为1200,第二个全连接层的输入向量长度为1200,输出向量长度为128,第三个全连接层的输入向量长度为128,输出向量长度为nclass,等于分类任务的类别数。因此,这3个全连接层的作用是将高维特征向量映射到低维向量,以便进行分类。

猜你喜欢

转载自blog.csdn.net/bobchen1017/article/details/129516287