torch.nn神经网络(1)--卷积函数使用与卷积层

torch.nn神经网络

1.nn.Module神经网络的使用

首先导入所需的模板:

import torch
from torch import nn

定义一个类,使其继承于nn.Module类:
①定义初始化函数时需要先完成其父类的初始化操作。
②同时定义一个forward函数,进行神经网络正向传播的作用。

class ChenYu(nn.Module):
    def __init__(self):
        super().__init__()          #首先要完成父类的初始化

    def forward(self,input):            #forward表示正向传播
        output=input+1
        return output

定义完成后实例化这个类,并进行传参,即可实现:

chenyu=ChenYu()
x = torch.tensor(1.0)
output = chenyu(x)
print(output)

运行结果👇: 这里初始化x为tensor类型的值为1.0的属性,经过神经网络的正向传播完成+1操作后,最终返回的结果为2.0

tensor(2.)

2.torch.nn.functional的使用

在Pytorch官方文档中我们可以看到torch.nn.functional的介绍:
关于该函数的使用方法👇:
在这里插入图片描述

关于函数的参数定义👇:
在这里插入图片描述

tips:这里对各参数进行一个解释:

F.conv2d(input,kernel,stride=2,padding=1)
input 代表输入
kernel 代表用于计算的卷积核
stride 代表没卷积核移动的步大小
padding 代表周围用于补充的数据

我们想要构造一个卷积网络,使用Fonctional.conv2d()函数构造如下的卷积网络:
在这里插入图片描述
首先需要导入模块:

import  torch
import torch.nn.functional as F

定义输入图像的55的矩阵,及33的卷积核矩阵,使用torch.tenser()函数将其转化为tensor类型:

input = torch.tensor([[1,2,0,3,1],
                      [0,1,2,3,1],
                      [1,2,1,0,0],
                      [5,2,3,1,1],
                      [2,1,0,1,1]])           #二维矩阵 就是[[]]两层

kernel =torch.tensor([[1,2,1],
                      [0,1,0],
                      [2,1,0]])              #卷积核  二维矩阵 转为tensor类型

使用torch.reshape()函数对其进行改变:

input=torch.reshape(input,(1,1,5,5))
kernel=torch.reshape(kernel,(1,1,3,3))

调用函数生成神经网络对数据进行处理:

output = F.conv2d(input,kernel,stride=1)
print('output',output)

output2 = F.conv2d(input,kernel,stride=2)
print('output2',output2)

output3 = F.conv2d(input,kernel,stride=1,padding=1)
print('output3',output3)

output4 = F.conv2d(input,kernel,stride=1,padding=0)
print('output4',output4)

output5 = F.conv2d(input,kernel,stride=2,padding=1)
print('output5',output5)

得到的结果为:

output tensor([[[[10, 12, 12],
          [18, 16, 16],
          [13,  9,  3]]]])
output2 tensor([[[[10, 12],
          [13,  3]]]])
output3 tensor([[[[ 1,  3,  4, 10,  8],
          [ 5, 10, 12, 12,  6],
          [ 7, 18, 16, 16,  8],
          [11, 13,  9,  3,  4],
          [14, 13,  9,  7,  4]]]])
output4 tensor([[[[10, 12, 12],
          [18, 16, 16],
          [13,  9,  3]]]])
output5 tensor([[[[ 1,  4,  8],
          [ 7, 16,  8],
          [14,  9,  4]]]])

3.nn.Module的卷积层

首先,导入模块并且载入数据集(采用的数据集为CIFAR10,DataLoader设置的batchsize为64:

import torch
import torchvision
from torch import nn
from torch.nn import Conv2d
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter

dataset = torchvision.datasets.CIFAR10('./dataset',train=False,transform=torchvision.transforms.ToTensor(),download=True)
dataloader = DataLoader(dataset,batch_size=64)

定义类,继承父类nn.Module,在其中定义卷积层Conv2d,设置输入channel为3,输出channel为6,stride为1,padding=0.

class ChenYu(nn.Module):
    def __init__(self):
        super(ChenYu, self).__init__()
        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

初始化类,并对数据集中的每个数据都进行卷积:

for data in dataloader:
    imgs , target = data
    output = chenyu(imgs)
    #输入的图像原始size为:torch.Size([64,3,32,32])
    #卷积后的图像size为:[64,6,30,30]    
    writer.add_images('input',imgs,step)      记录输入图像的信息          
    output = torch.reshape(output,(-1,3,30,30))
    #使用reshape函数,将torch.Size([64,6,32,32])  --->[xxx,3,30,30]   通道数从6变为3
    writer.add_images('output',output,step)   记录卷积后图像的信息

    step = step+1
write.close()

最终输出的结果展示:
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值