CNN-卷积操作pytorch实现

一、导入需要的模块

import torch
from torch import nn
from torch.nn import functional as F
import numpy as np

二、选择MNIST数据集,图像大小为28X28,通过卷积操作转换向量。

三、创建两套卷积核以及定义池化层,dropout层

class Net(nn.Module):

    def __init__(self):
        super().__init__()
        # 原始图像特征大小28x28:[1,1,28,28]···[N,C_out,H,W]
        # N:表示图片的数量,C_out:表示卷积核的数量,H,W表示图像的高,宽
        # 输入特征尺度大小:(w-k+2p)/Sw+1 
        # 创建第一套卷积核,输入的颜色通道:1,卷积核数量:6,卷积核大小:5x5
        # conv1:(28-5+2*0)/1+1 = 24
        self.conv1 = nn.Conv2d(in_channels=1,out_channels=6,kernel_size=5)
        
        # 输出特征:[1,6,24,24]
        # 池化层取最大特征值
        # pool: (24-2+2*0)/2+1=12
        self.pool = nn.MaxPool2d(kernel_size=2,stride=2)
        
        # 输出特征:[1,6,12,12]
        # Dropout随机失活,没有训练参数,默认丢弃连接数量50%
        self.drop1 = nn.Dropout()

        # 创建第二套卷积核,输入通道:6(由上一层决定),卷积核数量:16,卷积核大小:5。
        # conv2:(12-5+2*0)/1+1=8
        self.conv2 = nn.Conv2d(6,16,5)

        # 输出特征:[1,16,8,8]
        # pool:(8-2+2*0)/2+1=4
        self.pool = nn.MaxPool2d(kernel_size=2,stride=2)

三、定义激活函数非线性转换、   

# 卷积操作后,输出特征:[1,16,4,4]

# 卷积层计算后结果,转换向量,通过神经网络进行推理

self.fc1 = nn.Linear(16*4*4,120)    # (1,120)

self.fc2 = nn.Linear(120,84)        # (1,84)

self.fc3 = nn.Linear(84,10)         # (1,10)

四、通过池化操作以及激活函数转换

# flatten把高维矩阵2D,转换为一维向量,[batch_size,vector]
        x = torch.flatten(x,1)
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x

猜你喜欢

转载自blog.csdn.net/m0_71145378/article/details/127090577
今日推荐