在上一篇文章中介绍了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)
)