前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Pytorch中的Sequential

Pytorch中的Sequential

作者头像
月梦@剑心
发布2022-09-14 14:12:12
5670
发布2022-09-14 14:12:12
举报
文章被收录于专栏:月梦·剑心的技术专栏

春恋慕Pytorch中nn.Sequential是nn.Module的一个子类,Sequential已经实现了forward函数,因此不需要编写forward函数,Sequential会自动进行前向传播,这要求神经网络前一个模块的输出大小和后一个模块的输入大小是一致的,使用Sequential容器封装神经网络,使得代码更简洁,更结构化,不过这也使得神经网络灵活性变差,比如无法定义自己的forward等。

现将https://ymiir.top/index.php/2022/02/05/add_pooling_layer/文章中的神经网络改写成使用Sequential定义神经网络测试效果。

代码语言:javascript
复制
#import一系列依赖库
import torch
from PIL import Image
from tensorboardX import SummaryWriter
from torch import nn
from torch.nn import Sequential, Conv2d, MaxPool2d
from torch.utils.data import Dataset, DataLoader
import os
from torchvision import transforms
import torch.nn.functional as F

#定义的transforms对象,后面对图像进行变换时使用
#神经网络要求喂入的数据格式是tensor
#trans将PIL格式的image转化成为tensor格式的image
trans=transforms.ToTensor()
#神经网络要求喂入的数据图像大小一致
#我们./dataset/train/ants文件夹下
#图像大小不一致,需要将尺寸一致调为[3,375,500]
trans_re=transforms.Resize([375,500])
#首先创建自己的数据集
#我们的数据是存放在"./dataset/train/ants"下的蚂蚁照片
#定义自己的数据集类
class MyDataset(Dataset):
    def __init__(self,root_dir,label_dir):
        self.root_dir=root_dir
        self.label_dir=label_dir
        self.path=os.path.join(self.root_dir,self.label_dir)
        self.img_list=os.listdir(self.path)
    def __getitem__(self, item):
        #通过索引获取图片名称
        img_name=self.img_list[item]
        #拼接得到图像路径
        img_path=os.path.join(self.path,img_name)
        #打开图片,得到的图片格式是PIL格式的
        img=Image.open(img_path)
        #transforms的resize对象
        #要求输入为PIL格式,因此首先改变图像大小
        img=trans_re(img)
        #将图片转变为tensor格式
        img=trans(img)
        label=self.label_dir
        #返回一对(数据,标签)
        return img,label
    def __len__(self):
        return len(self.img_list)
#实例化数据集对象,传入路径
#得到数据集
mydataset=MyDataset('dataset/train','ants')
#dataloader将数据集分为
#一个一个batch,便于喂入神经网络
#这里的batch大小为16
dataloader=DataLoader(dataset=mydataset,batch_size=16)

#定义神经网络类
class MyModel(nn.Module):
    def __init__(self):
        super(MyModel, self).__init__()
        #添加卷积层,输入3通道图像
        #输出3通道图像,卷积核大小为3*3
        #上下步长为1,四周增加padding为1
        # self.conv=torch.nn.Conv2d(3,3,(3,3),padding=1)
        # #添加池化层,池化核尺寸为3*3,ceil_mode设置为True
        # self.pooling=torch.nn.MaxPool2d(3,ceil_mode=True)
        self.model1=Sequential(
            Conv2d(3, 3, (3, 3), padding=1),
            MaxPool2d(3, ceil_mode=True),
        )
    #前向传播函数
    def forward(self,x):
        #输入数据通过卷积,池化,并使用relu激活函数
        #返回输出的数据
        return F.relu(self.model1(x))

#创建神经网络对象
model=MyModel()
#日志存入./test文件夹
writer=SummaryWriter('./test002')
#tensorboard可以将多个图像
#组合在一起输出,分为多个step(0,1,2,...)
#便于得知训练中每个阶段网络的输出
step=0
#遍历dataloader中的batch
#分batch喂入数据集
for data in dataloader:
    #获取一组图像,一组标签
    #我们这里只对图像进行处理观察效果
    #实际上label无用
    imgs,label=data
    #图像经过神经网络处理得到输出
    output=model(imgs)
    #绘制处理之前的图像,每16(batch_size)张一组
    writer.add_images('原图',imgs,step)
    ##绘制处理之后的图像,每16(batch_size)张一组
    writer.add_images('后来',output,step)
    #step递增
    step=step+1

效果:

原图

处理后

同是step3,与不使用Sequential相比,处理后的图片,基本一致。色彩有些许差别的原因可能是初始的权重不同而导致的不同,因为我们的卷积核以及池化核中的数据是程序初始随机生成的。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-02-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 效果:
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档