神经网络搭建(1)----nn.Sequential

神经网络模型构建

采用CIFAR10中的数据,并对其进行简单的分类。以下图为例

输入:3通道,32×32 ( 经过一个5×5的卷积)
→ 变成32通道,32×32的图像 (经过2×2的最大池化)
→ 变成32通道,16×16的图像 ( 经过一个5×5的卷积)
→ 变成32通道,16×16的图像 (经过2×2的最大池化)
→ 变成32通道,8×8的图像 ( 经过一个5×5的卷积)
→ 变成64通道,8×8的图像(经过2×2的最大池化)
→ 变成64通道,4×4的图像
→ 把图像展平(Flatten)(变成64通道,1×1024 (64×4×4) 的图像)
→先通过一个线性层Linear(in_features=64 * 4 * 4, out_features=64)
→再经过一个线性层Linear(64, 10)→ 得到最终图像

以上就是一个神经网络模型的构建

神经网络中的参数设计及计算

卷积层的参数设计(以第一个卷积层conv2为例)

  • 输入图像为3通道,输出图像为32通道,故:in_channels=3,  out_channels=32
  • 卷积核尺寸为 kernel_size=5  (5*5)

  • 图像经过卷积层conv2前后的尺寸均为32×32,根据公式:

可得:
 

即:

若stride[0]或stride[1]设置为2,那么上面的padding也会随之扩展为-个很大的数,这很不合理。所以这里设置: stride[0] = stride[1] = 1,由此可得: padding[0] = padding[1]= 2

其余卷积层的参数设计及计算方法均同上

最大池化操作的参数设计(以第一个池化操作maxpool为例)

根据计算神经网络 torch.nn---Pooling layers(nn.MaxPool2d)-CSDN博客

可以得到卷积核尺寸为 kernel_size=2

其他参数为默认值

线性层的参数设计

  • 通过三次卷积和最大池化操作后,图像尺寸变为64通道4×4。之后使用Flatten()函数将图像展成一列,此时图像尺寸变为:1×(64×4×4),即1×1024

  • 因此,之后通过第一个线性层,(in_features=64 * 4 * 4, out_features=64)

  • 第二个线性层,(in_features=64 , out_features=10)

程序代码

import torch
from torch import nn
from torch.nn import Conv2d, MaxPool2d, Linear, Sequential, Flatten
from torch.utils.tensorboard import SummaryWriter

class Tudui(nn.Module):
    def __init__(self):
        super(Tudui, self).__init__()
        self.model = Sequential(
            Conv2d(3, 32, kernel_size=5, padding=2),
            MaxPool2d(kernel_size=2),
            Conv2d(32, 32, kernel_size=5, padding=2),
            MaxPool2d(kernel_size=2),
            Conv2d(32, 64, kernel_size=5, padding=2),
            MaxPool2d(kernel_size=2),
            Flatten(),
            Linear(in_features=64 * 4 * 4, out_features=64),
            Linear(64, 10)
        )

    def forward(self, x):
        x = self.model(x)
        return x

tudui = Tudui()
print(tudui)

input = torch.ones(64, 3, 32, 32)
output = tudui(input)
print(output.shape)

# 可视化神经网络 
writer = SummaryWriter('logs')
writer.add_graph(tudui, input)
writer.close()

这样就可以清晰地看到神经网络的相关参数

  • 16
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
双通道卷积神经网络可以通过在nn.Sequential()中添加不同的层来构建。 以下是一个示例代码: ```python import torch.nn as nn class DoubleChannelCNN(nn.Module): def __init__(self): super(DoubleChannelCNN, self).__init__() self.conv1 = nn.Conv2d(3, 32, kernel_size=3, padding=1) self.bn1 = nn.BatchNorm2d(32) self.relu1 = nn.ReLU(inplace=True) self.conv2 = nn.Conv2d(32, 64, kernel_size=3, padding=1) self.bn2 = nn.BatchNorm2d(64) self.relu2 = nn.ReLU(inplace=True) self.pool1 = nn.MaxPool2d(kernel_size=2, stride=2) self.conv3 = nn.Conv2d(64, 128, kernel_size=3, padding=1) self.bn3 = nn.BatchNorm2d(128) self.relu3 = nn.ReLU(inplace=True) self.conv4 = nn.Conv2d(128, 256, kernel_size=3, padding=1) self.bn4 = nn.BatchNorm2d(256) self.relu4 = nn.ReLU(inplace=True) self.pool2 = nn.MaxPool2d(kernel_size=2, stride=2) self.fc1 = nn.Linear(256 * 7 * 7, 1024) self.dropout = nn.Dropout(p=0.5) self.fc2 = nn.Linear(1024, 10) def forward(self, x): x1 = x[:, :3] # 第1个通道 x2 = x[:, 3:] # 第2个通道 x1 = self.relu1(self.bn1(self.conv1(x1))) x1 = self.pool1(self.relu2(self.bn2(self.conv2(x1)))) x1 = self.relu3(self.bn3(self.conv3(x1))) x1 = self.pool2(self.relu4(self.bn4(self.conv4(x1)))) x1 = x1.view(x1.size(0), -1) x2 = self.relu1(self.bn1(self.conv1(x2))) x2 = self.pool1(self.relu2(self.bn2(self.conv2(x2)))) x2 = self.relu3(self.bn3(self.conv3(x2))) x2 = self.pool2(self.relu4(self.bn4(self.conv4(x2)))) x2 = x2.view(x2.size(0), -1) x = torch.cat((x1, x2), dim=1) x = self.dropout(self.fc1(x)) x = self.fc2(x) return x ``` 在这个例子中,我们首先定义了一个DoubleChannelCNN类,它继承了nn.Module。在构造函数中,我们定义了所有的卷积层、池化层、全连接层和dropout层。在前向传播函数中,我们将输入数据分成两个通道,并对每个通道进行相同的卷积操作,然后将它们连接在一起,通过全连接层和dropout层得到最终的输出。 这是一个简单的例子,你可以根据你的具体需求来修改和扩展它。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值