trainset = torchvision.datasets.CIFAR10(root='./data', train=True,download=False, transform=transform) :
- torchvision.datasets.CIFAR10 用于加载 CIFAR10 数据集。
- root='./data' 指定数据集的存储路径。
- train=True 表示加载训练集数据。
- download=False 表示不自动下载数据集(假设数据集已经存在)。
- transform=transform 表示对加载的数据应用之前定义的转换操作。
trainloader = torch.utils.data.DataLoader(trainset, batch_size=4,shuffle=True, num_workers=2) :
- torch.utils.data.DataLoader 创建一个数据加载器,用于按批次加载数据。
- trainset 是要加载的数据集。
- batch_size=4 指定每个批次包含 4 个样本。
- shuffle=True 表示在每个 epoch 中打乱数据顺序。
- num_workers=2 指定使用 2 个子进程来加载数据。
testset = torchvision.datasets.CIFAR10(root='./data', train=False,download=False, transform=transform) :与加载训练集类似,这里加载的是测试集数据( train=False )。
testloader = torch.utils.data.DataLoader(testset, batch_size=4,shuffle=False, num_workers=2) :创建测试集的数据加载器, shuffle=False 表示测试集数据不打乱顺序。
classes = ('plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse','ship', 'truck') :定义了 CIFAR10 数据集中的 10 个类别名称。
def __init__(self): 类的构造函数,用于初始化神经网络的层。
super(CNNNet, self).__init__() :调用父类( nn.Module )的构造函数,这是在自定义神经网络类中必须要做的一步。
self.conv1 = nn.Conv2d(in_channels=3, out_channels=16, kernel_size=5, stride=1) :
定义第一个卷积层,输入通道数为 3(通常对应 RGB 图像),输出通道数为 16,卷积核大小为 5x5,步长为 1。
self.pool1 = nn.MaxPool2d(kernel_size=2, stride=2) :
定义第一个最大池化层,池化核大小为 2x2,步长为 2。
self.conv2 = nn.Conv2d(in_channels=16, out_channels=36, kernel_size=3, stride=1) :
定义第二个卷积层,输入通道数为 16,输出通道数为 36,卷积核大小为 3x3,步长为 1。
self.pool2 = nn.MaxPool2d(kernel_size=2, stride=2) :
定义第二个最大池化层,池化核大小为 2x2,步长为 2。
self.fc1 = nn.Linear(1296, 128) :定义第一个全连接层,输入特征数为 1296,输出特征数为 128。
self.fc2 = nn.Linear(128, 10) :定义第二个全连接层,输入特征数为 128,输出特征数为 10(对应 CIFAR10 数据集的 10 个类别)。
def forward(self, x): 定义前向传播函数,描述了数据在神经网络中的流动路径。
x = self.pool1(F.relu(self.conv1(x))) :对输入 x 进行第一次卷积操作,然后应用 ReLU 激活函数,最后进行第一次最大池化操作。
x = self.pool2(F.relu(self.conv2(x))) :对经过第一次卷积和池化后的 x 进行第二次卷积操作,然后应用 ReLU 激活函数,最后进行第二次最大池化操作。
x = x.view(-1, 36 * 6 * 6) :将二维的特征图展平为一维向量,以便输入到全连接层中。 -1 表示自动计算该维度的大小。
x = F.relu(self.fc2(F.relu(self.fc1(x)))) :
对展平后的 x 进行第一次全连接操作,应用 ReLU 激活函数,然后进行第二次全连接操作,再应用 ReLU 激活函数。
return x :返回经过神经网络处理后的输出。
net = net.to(device) :将神经网络模型移动到之前定义的设备( cuda 或 cpu )上。
print("net have {} paramerters in total".format(sum(x.numel() for x in net.parameters()))) :
统计神经网络中所有可训练参数的数量,并打印出来。这里有个拼写错误, paramerters 应该是 parameters 。
训练配置中的损失函数和优化器设置
提取前四层
训练模型