import torch.nn.functional as F
import torch
loss_func = F.cross_entropy
def model(xb):return xb.mm(weights)+bias
from torch import nn
class Mnist_NN(nn.Module):def __init__(self):super().__init__()self.hidden1 = nn.Linear(784,128)self.hidden2 = nn.Linear(128,256)self.out = nn.Linear(256,10)def forward(self,x):x = F.relu(self.hidden1(x))x = F.relu(self.hidden2(x))x = self.out(x)return x
net = Mnist_NN()
print(net)
for name, parameter in net.named_parameters():print(name,parameter,parameter.size())
卷积神经网络参数 :
滑动窗口步长
卷积核尺寸
边缘填充
因为边缘点利用少,加入填充,可以使原本图像边缘点被利用增加
池化层
最大池化,神经网络传递过程中最大值一般比较重要,参数在更新过程中算出的最大值说明权重大
池化层不涉及任何计算,只是筛选
全连接层
最后还要在池化层的基础上将特征图拉成一个向量
残差神经网络主要来解决随着网络层数的增加效果下降的问题
手写数字识别
导包
import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets,transforms
from torch.utils.data import DataLoader
构造模型
class numberCNN(nn.Module):def __init__(self):super(numberCNN,self).__init__()self.conv1 = nn.Sequential(nn.Conv2d(in_channels=1, out_channels=16, kernel_size=5, stride=1, padding=2 ),nn.ReLU(),nn.MaxPool2d(kernel_size=2))self.conv2 = nn.Sequential(nn.Conv2d(16,32,5,1,2), nn.ReLU(),nn.MaxPool2d(2) )self.out = nn.Linear(7*7*32,10)def forward(self,x:torch.Tensor):x = self.conv1(x)x = self.conv2(x)x = x.view(x.size(0),-1) output = self.out(x)return output
计算模型预测的准确率
def accuracy(predictions,labels):pred = torch.max(predictions.data,1)[1]rights = pred.eq(labels.data.view_as(pred)).sum()return rights, len(labels)
开始训练
def start():input_size = 28 num_classes = 10 num_epochs = 3 batch_size = 64 train_dataset = datasets.MNIST(root='./data',train=True,transform=transforms.ToTensor(),download=True)test_dataset = datasets.MNIST(root='./data',train=False,transform=transforms.ToTensor(),download=True)"""在 PyTorch 中,DataLoader 是一个迭代器,它能够从数据集中加载数据,并且对数据进行批处理(batching)、乱序(shuffling)等操作。当你使用 enumerate(train_loader) 遍历时,data 实际上是数据加载器返回的一个批次的数据。data 的形式在每次迭代中,data 是一个元组(tuple),包含两个元素:inputs:一个包含输入数据(通常是图像)的张量。labels:一个包含相应标签(通常是类别标签)的张量。"""train_loader = DataLoader(dataset=train_dataset,batch_size=batch_size,shuffle=True)test_loader = DataLoader(dataset=test_dataset,batch_size=batch_size,shuffle=True)myModel = numberCNN()criterion = nn.CrossEntropyLoss()optimizer = optim.Adam(myModel.parameters(),lr=0.001)for epoch in range(num_epochs):train_right = []for idx, data in enumerate(train_loader):inputs, labels = datamyModel.train() outputs = myModel(inputs)loss = criterion(outputs,labels)"""用于清空(或重置)优化器中积累的梯度。这是在每次反向传播之前需要执行的一个步骤,目的是为了防止梯度累积,从而确保每次计算梯度时都是基于当前批次的数据。在每次迭代中,当我们计算完损失函数并通过反向传播计算梯度之后,梯度会被累积在模型参数的 .grad 属性中。如果不清空这些梯度,那么在下一次迭代中,旧的梯度会与新的梯度相加,这可能会导致错误的结果。"""optimizer.zero_grad() loss.backward()"""在反向传播(backpropagation)过程中,PyTorch 计算了损失函数相对于模型参数的梯度。optimizer.step() 使用这些梯度来更新模型参数,使损失函数的值朝着最小化的方向变化。"""optimizer.step()right = accuracy(outputs,labels)train_right.append(right)"""训练过程中定期评估模型的性能,并打印出训练和验证的准确率。以便于监控训练进度,防止过拟合,调整训练参数"""if idx%100==0:myModel.eval() val_right = [] for valData in test_loader:valInputs, valLabels = valDataoutput = myModel(valInputs)right = accuracy(output,valLabels)val_right.append(right)train_r = (sum([tup[0] for tup in train_right]), sum([tup[1] for tup in train_right]))val_r = (sum([tup[0] for tup in val_right]), sum([tup[1] for tup in val_right]))print("当前epochL", epoch, "当前训练量:", (idx+1)*batch_size)print("训练正确个数:", train_r[0].numpy(), "训练总个数:", train_r[1],"训练准确率:", train_r[0].numpy() / train_r[1])print("测试正确个数:", val_r[0].numpy(), "测试总个数:", val_r[1],"测试准确率:", val_r[0].numpy() / val_r[1])
start()
当前epochL 0 当前训练量: 64
训练正确个数: 7 训练总个数: 64 训练准确率: 0.109375
测试正确个数: 1191 测试总个数: 10000 测试准确率: 0.1191
当前epochL 0 当前训练量: 6464
训练正确个数: 5010 训练总个数: 6464 训练准确率: 0.7750618811881188
测试正确个数: 9260 测试总个数: 10000 测试准确率: 0.926
当前epochL 0 当前训练量: 12864
训练正确个数: 10963 训练总个数: 12864 训练准确率: 0.8522232587064676
测试正确个数: 9556 测试总个数: 10000 测试准确率: 0.9556
当前epochL 0 当前训练量: 19264
训练正确个数: 17087 训练总个数: 19264 训练准确率: 0.8869912790697675
测试正确个数: 9634 测试总个数: 10000 测试准确率: 0.9634
当前epochL 0 当前训练量: 25664
训练正确个数: 23263 训练总个数: 25664 训练准确率: 0.906444825436409
测试正确个数: 9707 测试总个数: 10000 测试准确率: 0.9707
当前epochL 0 当前训练量: 32064
训练正确个数: 29456 训练总个数: 32064 训练准确率: 0.9186626746506986
测试正确个数: 9732 测试总个数: 10000 测试准确率: 0.9732
当前epochL 0 当前训练量: 38464
训练正确个数: 35638 训练总个数: 38464 训练准确率: 0.9265287021630616
测试正确个数: 9745 测试总个数: 10000 测试准确率: 0.9745
当前epochL 0 当前训练量: 44864
训练正确个数: 41866 训练总个数: 44864 训练准确率: 0.933175820256776
测试正确个数: 9762 测试总个数: 10000 测试准确率: 0.9762
当前epochL 0 当前训练量: 51264
训练正确个数: 48115 训练总个数: 51264 训练准确率: 0.9385728776529338
测试正确个数: 9801 测试总个数: 10000 测试准确率: 0.9801
当前epochL 0 当前训练量: 57664
训练正确个数: 54338 训练总个数: 57664 训练准确率: 0.9423210321864595
测试正确个数: 9782 测试总个数: 10000 测试准确率: 0.9782
当前epochL 1 当前训练量: 64
训练正确个数: 61 训练总个数: 64 训练准确率: 0.953125
测试正确个数: 9823 测试总个数: 10000 测试准确率: 0.9823
当前epochL 1 当前训练量: 6464
训练正确个数: 6335 训练总个数: 6464 训练准确率: 0.9800433168316832
测试正确个数: 9812 测试总个数: 10000 测试准确率: 0.9812
当前epochL 1 当前训练量: 12864
训练正确个数: 12602 训练总个数: 12864 训练准确率: 0.9796330845771144
测试正确个数: 9807 测试总个数: 10000 测试准确率: 0.9807
当前epochL 1 当前训练量: 19264
训练正确个数: 18857 训练总个数: 19264 训练准确率: 0.9788725083056479
测试正确个数: 9848 测试总个数: 10000 测试准确率: 0.9848
当前epochL 1 当前训练量: 25664
训练正确个数: 25131 训练总个数: 25664 训练准确率: 0.979231608478803
测试正确个数: 9835 测试总个数: 10000 测试准确率: 0.9835
当前epochL 1 当前训练量: 32064
训练正确个数: 31421 训练总个数: 32064 训练准确率: 0.9799463572854291
测试正确个数: 9843 测试总个数: 10000 测试准确率: 0.9843
当前epochL 1 当前训练量: 38464
训练正确个数: 37705 训练总个数: 38464 训练准确率: 0.9802672628951747
测试正确个数: 9839 测试总个数: 10000 测试准确率: 0.9839
当前epochL 1 当前训练量: 44864
训练正确个数: 43993 训练总个数: 44864 训练准确率: 0.9805857703281027
测试正确个数: 9854 测试总个数: 10000 测试准确率: 0.9854
当前epochL 1 当前训练量: 51264
训练正确个数: 50303 训练总个数: 51264 训练准确率: 0.9812539013732834
测试正确个数: 9840 测试总个数: 10000 测试准确率: 0.984
当前epochL 1 当前训练量: 57664
训练正确个数: 56593 训练总个数: 57664 训练准确率: 0.9814268867924528
测试正确个数: 9883 测试总个数: 10000 测试准确率: 0.9883
当前epochL 2 当前训练量: 64
训练正确个数: 64 训练总个数: 64 训练准确率: 1.0
测试正确个数: 9859 测试总个数: 10000 测试准确率: 0.9859
当前epochL 2 当前训练量: 6464
训练正确个数: 6397 训练总个数: 6464 训练准确率: 0.989634900990099
测试正确个数: 9879 测试总个数: 10000 测试准确率: 0.9879
当前epochL 2 当前训练量: 12864
训练正确个数: 12708 训练总个数: 12864 训练准确率: 0.9878731343283582
测试正确个数: 9860 测试总个数: 10000 测试准确率: 0.986
当前epochL 2 当前训练量: 19264
训练正确个数: 19024 训练总个数: 19264 训练准确率: 0.9875415282392026
测试正确个数: 9885 测试总个数: 10000 测试准确率: 0.9885
当前epochL 2 当前训练量: 25664
训练正确个数: 25328 训练总个数: 25664 训练准确率: 0.9869077306733167
测试正确个数: 9883 测试总个数: 10000 测试准确率: 0.9883
当前epochL 2 当前训练量: 32064
训练正确个数: 31656 训练总个数: 32064 训练准确率: 0.9872754491017964
测试正确个数: 9791 测试总个数: 10000 测试准确率: 0.9791
当前epochL 2 当前训练量: 38464
训练正确个数: 37968 训练总个数: 38464 训练准确率: 0.9871048252911814
测试正确个数: 9886 测试总个数: 10000 测试准确率: 0.9886
当前epochL 2 当前训练量: 44864
训练正确个数: 44272 训练总个数: 44864 训练准确率: 0.9868045649072753
测试正确个数: 9882 测试总个数: 10000 测试准确率: 0.9882
当前epochL 2 当前训练量: 51264
训练正确个数: 50580 训练总个数: 51264 训练准确率: 0.9866573033707865
测试正确个数: 9876 测试总个数: 10000 测试准确率: 0.9876
当前epochL 2 当前训练量: 57664
训练正确个数: 56889 训练总个数: 57664 训练准确率: 0.9865600721420644
测试正确个数: 9877 测试总个数: 10000 测试准确率: 0.9877
import torch
print(torch.cuda.device_count())
torch.cuda.is_available()