LeNet实现

LeNet网络的代码实现pytroch 

 

import torch
import torchvision
from torch import nn
from torch.utils.data import DataLoader
import torch.nn.functional as F
from torch.utils.tensorboard import SummaryWriter

transform=torchvision.transforms.Compose(
    [torchvision.transforms.ToTensor(),torchvision.transforms.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5))])
#训练数据集
train_dataset=torchvision.datasets.CIFAR10("dataset",train=True,transform=transform,download=True)
train_loader=DataLoader(train_dataset,batch_size=100,shuffle=True,num_workers=0)

#测试数据集
testset=torchvision.datasets.CIFAR10("dataset",train=False,transform=transform,download=True)
testloader=DataLoader(testset,batch_size=10000,shuffle=True,num_workers=0)

test_data_iter=iter(testloader)
test_image,test_label=test_data_iter.__next__()

class LeNet(nn.Module):
    def __init__(self):
        super(LeNet,self).__init__()
        self.conv1=nn.Conv2d(3,16,5)
        self.pool1=nn.MaxPool2d(2,2)
        self.conv2=nn.Conv2d(16,32,5)
        self.pool2=nn.MaxPool2d(2,2)
        self.linear1=nn.Linear(32*5*5,120)
        self.linear2=nn.Linear(120,84)
        self.linear3=nn.Linear(84,10)

    def forward(self,x):
        x=F.relu(self.conv1(x))
        x=self.pool1(x)
        x=F.relu(self.conv2(x))
        x=self.pool2(x)
        x=x.view(-1,32*5*5)
        x=F.relu(self.linear1(x))
        x=F.relu(self.linear2(x))
        x=self.linear3(x)
        return x
net=LeNet().cuda()
loss_function= nn.CrossEntropyLoss().cuda()
optimizer=torch.optim.Adam(net.parameters(),lr=0.001)
writer=SummaryWriter("keshihua")

step=0
#开始训练
for epoch in range(10):
    running_loss=0.0
    for dataloader in train_loader:
        inputs,labels=dataloader
        inputs=inputs.cuda()
        labels=labels.cuda()

        optimizer.zero_grad()
        outputs=net(inputs)
        loss = loss_function(outputs,labels)
        loss.backward()
        optimizer.step()
        running_loss+=loss.item()
        writer.add_scalar("train_loss",loss,step)
        if step %500==0:
            with torch.no_grad():
                test_image=test_image.cuda()
                outputs=net(test_image)
                outputs=outputs.cuda()
                predict_y=torch.max(outputs,dim=1)[1]
                predict_y=predict_y.cuda()
                test_label=test_label.cuda()
                accuracy= (predict_y==test_label).sum().item()/test_label.size(0)
                print("step={0},train_loss={1},test_accuracy={2}".format(step+1,running_loss,accuracy))
                writer.add_scalar("test_accuracy",accuracy, step)
        step+=1

writer.close()
print("训练完成")
save_path='LeNet.pth'
torch.save(net.state_dict(),save_path)


 训练误差以及测试集的精度(数据集比较老,b站博主泡跑也是68的精确率)

tensorboard可视化误差和精度

LeNet-5神经网络 C源代码,这个写的比较好,可以用gcc编译去跑,结合理论可以对深度学习有更深刻的了解 介绍 根据YANN LECUN的论文《Gradient-based Learning Applied To Document Recognition》设计的LeNet-5神经网络,C语言写成,不依赖任何第三方库。 MNIST手写字符集初代训练识别率97%,多代训练识别率98%。 DEMO main.c文件为MNIST数据集的识别DEMO,直接编译即可运行,训练集60000张,测试集10000张。 项目环境 该项目为VISUAL STUDIO 2015项目,用VISUAL STUDIO 2015 UPDATE1及以上直接打开即可编译。采用ANSI C编写,因此源码无须修改即可在其它平台上编译。 如果因缺少openmp无法编译,请将lenet.c中的#include和#pragma omp parallel for删除掉即可。 API #####批量训练 lenet: LeNet5的权值的指针,LeNet5神经网络的核心 inputs: 要训练的多个图片对应unsigned char二维数组的数组,指向的二维数组的batchSize倍大小内存空间指针。在MNIST测试DEMO中二维数组为28x28,每个二维数组数值分别为对应位置图像像素灰度值 resMat:结果向量矩阵 labels:要训练的多个图片分别对应的标签数组。大小为batchSize batchSize:批量训练输入图像(二维数组)的数量 void TrainBatch(LeNet5 *lenet, image *inputs, const char(*resMat)[OUTPUT],uint8 *labels, int batchSize); #####单个训练 lenet: LeNet5的权值的指针,LeNet5神经网络的核心 input: 要训练的图片对应二维数组 resMat:结果向量矩阵 label: 要训练的图片对应的标签 void Train(LeNet5 *lenet, image input, const char(*resMat)[OUTPUT],uint8 label); #####预测 lenet: LeNet5的权值的指针,LeNet5神经网络的核心 input: 输入的图像的数据 labels: 结果向量矩阵指针 count: 结果向量个数 return 返回值为预测的结果 int Predict(LeNet5 *lenet, image input, const char(*labels)[LAYER6], int count); #####初始化 lenet: LeNet5的权值的指针,LeNet5神经网络的核心
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值