PyTorch项目实战10——CIFAR10数据打印网络层次
  R1u4c9Dlbnmn 2023年11月02日 31 0

在上一篇文章中介绍了CIFAR10数据的获取,今天这篇文章对其继续进行优化,创建神经网络并打印出网络层次。

1 增加引用

引入torch中的神经网络

import torch.nn as nn
import torch.nn.functional as fun

2 是否使用CUDA

在获取CIFA10数据前,首先对GPU是否存在进行判断:

  • 首先使用CUDA;
  • 如果没有CUDA,再选择CPU
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")

3 构建网络

3.1 创建用于处理神经网络的类

class CNNNet(nn.Module):

3.2 对神经网络初始化

在初始化方法中,共定义了两层卷积网络,每个网络均进行了池化。

需要注意的是:

  • 第二层卷积网络的输入通道数,就是上一层卷积网络的输出通道数;
  • 池化层不会改变通道数
# 定义层级
def __init__(self):
    super(CNNNet, self).__init__()
    # 第一层卷积网络,输入通道,输出通道,卷积盒,步长
    self.conv1 = nn.Conv2d(in_channels=3, out_channels=16, kernel_size=5, stride=1)
    # 第一个池化层,卷积盒,步长,不会改变通道数
    self.pool1 = nn.MaxPool2d(kernel_size=2, stride=2)
    # 第二层卷积网络
    self.conv2 = nn.Conv2d(in_channels=16, out_channels=36, kernel_size=3, stride=1)
    self.pool2 = nn.MaxPool2d(kernel_size=2, stride=2)
    # 全连接层,输入特征,输出特征
    self.fc1 = nn.Linear(1296, 128)
    self.fc2 = nn.Linear(128, 10)

3.3 将网络中的各层联合

上一步只是能神经网络进行了初始化,还需要将各网络层级进行串联,以确保能够发挥作用。

# 串联层级
def forward(self, x):
    # 处理卷积之后的非线性变化
    # 对原数据做第一层卷积后再进行池化操作
    x = self.pool1(fun.relu(self.conv1(x)))
    # 对做完第一层卷积的数据,再次进行第二层卷积及池化操作
    x = self.pool2(fun.relu(self.conv2(x)))
    # reshape
    x = x.view(-1, 36*6*6)
    # 完成两层全连接,并进行非线性变化
    x = fun.relu(self.fc2(fun.relu(self.fc1(x))))
    return x

3.4 打印出网络层次

在main方法的末尾,添加神经网络类的对象定义及初始化,并打印网络结构到控制台中

net = CNNNet()
net = net.to(device)

# 查看网络结构
print(net)

# 查看模型中的前四层结构
print(nn.Sequential(*list(net.children())[:4]))

运行程序,在随机展示的批次图片出现进将其关闭后,程序将输出网络层次结果

bird frog deer ship

CNNNet(

(conv1): Conv2d(3, 16, kernel_size=(5, 5), stride=(1, 1))

(pool1): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)

(conv2): Conv2d(16, 36, kernel_size=(3, 3), stride=(1, 1))

(pool2): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)

(fc1): Linear(in_features=1296, out_features=128, bias=True)

(fc2): Linear(in_features=128, out_features=10, bias=True)

)

Sequential(

(0): Conv2d(3, 16, kernel_size=(5, 5), stride=(1, 1))

(1): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)

(2): Conv2d(16, 36, kernel_size=(3, 3), stride=(1, 1))

(3): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)

)

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  3XDZIv8qh70z   2023年12月23日   26   0   0 2d2d
R1u4c9Dlbnmn