[pytorch] 7. 神经网络搭建实例

文章介绍了如何在PyTorch中设计并验证一个CNN模型,包括参数设定、Sequential模式的使用以及Tensorboard的可视化功能。
摘要由CSDN通过智能技术生成

题目

目标搭建模型:
在这里插入图片描述

参数确定

设置卷积层等的参数时,除了in_channels、out_channels、kernel_size等,还需要设置padding等参数,可以根据官方给出的公式计算需要的参数是多少
在这里插入图片描述
带入已知数据,其中dilation没说空洞卷积,要用她的默认值1
里面只有padding和stride是未知数,求解方程,得padding=2, stride=1

代码

from torch import nn

class Test(nn.Module):
    def __init__(self):
        super(Test,self).__init__()
        self.conv1 = nn.Conv2d(in_channels=3, out_channels=32, kernel_size=5, padding=2)
        self.maxpool1 = nn.MaxPool2d(kernel_size=2)
        self.conv2 = nn.Conv2d(in_channels=32, out_channels=32, kernel_size=5, padding=2) # 计算同上
        self.maxpool2 = nn.MaxPool2d(kernel_size=2)
        self.conv3 = nn.Conv2d(in_channels=32, out_channels=64, kernel_size=5, padding=2)
        self.maxpool3 = nn.MaxPool2d(kernel_size=2)
        self.flatten = nn.Flatten() 
        # 64@4*4 到 64那里其实省略了步骤
        # 上一步是64*4*4, 这一步就是将其展开成一行,就是1024
        # 之后1024再到64 这就是一个线性层
        self.linear1 = nn.Linear(1024, 64)
        # 64到10 这也是一个线性层
        self.linear2 = nn.Linear(64, 10)
    
    def forward(self, x):
        x = self.conv1(x)
        x = self.maxpool1(x)
        x = self.conv2(x)
        x = self.maxpool2(x)
        x = self.conv3(x)
        x = self.maxpool3(x)
        x = self.flatten(x)
        x = self.linear1(x)
        x = self.linear2(x)
        return x
    
    # 这样网络就写完了

net = Test()
print(net)

这就可以看到网路的结构:
在这里插入图片描述

在实际应用中如何看网络的正确性

关注数据经过网络后是否是想要的输出
torch提供了一些创建数据的方法 可以进行测试

net = Test()
input = torch.ones((64,3,32,32)) # 64张图片,3个通道,32*32大小,全是1
output = net(input)
print(output.shape)

在这里插入图片描述

使用sequential更新代码

class Test(nn.Module):
    def __init__(self):
        super(Test,self).__init__()
        self.model1 = nn.Sequential(
            nn.Conv2d(in_channels=3, out_channels=32, kernel_size=5, padding=2),
            nn.MaxPool2d(kernel_size=2),
            nn.Conv2d(in_channels=32, out_channels=32, kernel_size=5, padding=2), # 计算同上
            nn.MaxPool2d(kernel_size=2),
            nn.Conv2d(in_channels=32, out_channels=64, kernel_size=5, padding=2),
            nn.MaxPool2d(kernel_size=2),
            nn.Flatten() ,
            nn.Linear(1024, 64),
            nn.Linear(64, 10),
        )
    
    def forward(self, x):
        x = self.model1(x)
        return x
        # 这就不需要像之前那种一样一个一个调用了
    
    # 这样网络就写完了

可视化

除了用print可视化,tensorboard也可以

from torch import nn
import torch
from torch.utils.tensorboard import SummaryWriter


class Test(nn.Module):
    def __init__(self):
        super(Test,self).__init__()
        self.model1 = nn.Sequential(
            nn.Conv2d(in_channels=3, out_channels=32, kernel_size=5, padding=2),
            nn.MaxPool2d(kernel_size=2),
            nn.Conv2d(in_channels=32, out_channels=32, kernel_size=5, padding=2), # 计算同上
            nn.MaxPool2d(kernel_size=2),
            nn.Conv2d(in_channels=32, out_channels=64, kernel_size=5, padding=2),
            nn.MaxPool2d(kernel_size=2),
            nn.Flatten() ,
            nn.Linear(1024, 64),
            nn.Linear(64, 10),
        )
    
    def forward(self, x):
        x = self.model1(x)
        return x
        # 这就不需要像之前那种一样一个一个调用了
    
    # 这样网络就写完了

net = Test()
print(net)

input = torch.ones((64,3,32,32)) # 64张图片,3个通道,32*32大小
output = net(input)
print(output.shape)

writer = SummaryWriter('logs')
writer.add_graph(net, input)
writer.close()

效果图
在这里插入图片描述
双击可以逐层打开
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值