经典模型之Lenet

2024-03-23 06:48
文章标签 模型 经典 lenet

本文主要是介绍经典模型之Lenet,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

经典模型之Lenet

模型背景

1985年,Rumelhart和Hinton等人提出了后向传播(BackPropagation,BP)算法[1](也有说1986年的,指的是他们另一篇paper:Learningrepresentations by back-propagating errors),使得神经网络的训练变得简单可行,这篇文章在GoogleScholar上的引用次数达到了19000多次,目前还是比Cortes和Vapnic的Support-Vector Networks稍落后一点,不过以Deep Learning最近的发展劲头来看,超越指日可待。

​ 几年后,LeCun利用BP算法来训练多层神经网络用于识别手写邮政编码,这个工作就是CNN的开山之作,如图2所示,多处用到了5*5的卷积核,但在这篇文章中LeCun只是说把5*5的相邻区域作为感受野,并未提及卷积或卷积神经网络。

容易看出,Lenet网络结构由1个数据层、3个卷积层、2个池化层、2个全连接层和、1个SoftmaxLoss层和1个输出层组成。

solver.prototxt

# The train/test net protocol buffer definition
net: "examples/mnist/lenet_train_test.prototxt"
# test_iter specifies how many forward passes the test should carry out.
# In the case of MNIST, we have test batch size 100 and 100 test iterations,
# covering the full 10,000 testing images.
test_iter: 100
# Carry out testing every 500 training iterations.
test_interval: 500
# The base learning rate, momentum and the weight decay of the network.
base_lr: 0.01
momentum: 0.9
weight_decay: 0.0005
# The learning rate policy
lr_policy: "inv"
gamma: 0.0001
power: 0.75
# Display every 100 iterations
display: 100
# The maximum number of iterations
max_iter: 10000
# snapshot intermediate results
snapshot: 5000
snapshot_prefix: "examples/mnist/lenet"
# solver mode: CPU or GPU
solver_mode: CPU
~                     

参数说明

  • net

训练/测试网络结构

  • test_iter

表示测试的次数;比如,你的test阶段的batchsize=100,而你的测试数据为10000张图片,则你的测试次数为10000/100=100次;即,你的test_iter=100;

  • test_interval

表示你的网络训练多少次才进行一次训练

  • base_lr

表示基础学习率,在参数梯度下降优化的过程中,学习率会有所调整,而调整的策略就可通过lr_policy这个参数进行设置;

  • momentum

表示上一次梯度更新的权重

  • weight_decay

表示权重衰减,用于防止过拟合

  • lr_policy

–>fixed:保持base_lr不变;

–>step: 如果设置为step,则还需要设置一个stepsize, 返回 base_lr * gamma ^ (floor(iter / stepsize)),其中iter 表示当前的迭代次数;

–>exp: 返回base_lr * gamma ^ iter, iter为当前迭代次数;

–>inv:如果设置为inv,还需要设置一个power, 返回base_lr * (1 + gamma * iter) ^ (- power)

–>multistep: 如果设置为multistep,则还需要设置一个stepvalue。这个参数和step很相似,step是均匀等间隔变化,而mult-step则是根据stepvalue值变化

–>poly: 学习率进行多项式误差, 返回 base_lr (1 - iter/max_iter) ^ (power)

–>sigmoid:学习率进行sigmod衰减,返回 base_lr ( 1/(1 + exp(-gamma * (iter - stepsize))))

  • gamma

和lr_policy有关

  • power

和lr_policy有关

  • display

每隔多少次训练显示结果

  • max_iter

最大迭代次数

  • snapshot

保存模型间隔

  • snapshot_prefix

保存模型的前缀

  • solver_mode

是否使用GPU

train.prototxt

name: "LeNet"
layer {name: "mnist"type: "Data"          // 数据层top: "data"top: "label"include {phase: TRAIN}transform_param {scale: 0.00390625   // 归一化,1/256}data_param {source: "examples/mnist/mnist_train_lmdb"batch_size: 64      // 一次处理图片数目backend: LMDB       // LMDB格式,也可以为图片格式}
}
layer {name: "mnist"type: "Data"top: "data"top: "label"include {phase: TEST}transform_param {scale: 0.00390625}data_param {source: "examples/mnist/mnist_test_lmdb"batch_size: 100backend: LMDB}
}
layer {name: "conv1"type: "Convolution"   // 卷积层bottom: "data"top: "conv1"param {lr_mult: 1          // weight学习率,和solver中的base_lr关联}param {lr_mult: 2          // bias学习率,一般为weight学习率系数的两倍}convolution_param {num_output: 20      // 通道数,新的通道数,优化时经常会减小通道数kernel_size: 5      // 卷积核大小stride: 1           // 步长weight_filler {     // 权值初始化,xavier/guassion/constanttype: "xavier"    // 可以理解为一种均匀分布,跟输入的维度有关}bias_filler {       // 偏置初始化type: "constant"  // 全为0}}
}
layer {name: "pool1"type: "Pooling"       // 池化层bottom: "conv1"top: "pool1"pooling_param {pool: MAX           // 最大化方法,也可以取均值/最小化kernel_size: 2      // 卷积核大小,起缩放效果stride: 2           // 步长}
}
layer {name: "conv2"type: "Convolution"bottom: "pool1"top: "conv2"param {lr_mult: 1}param {lr_mult: 2}convolution_param {num_output: 50kernel_size: 5stride: 1weight_filler {type: "xavier"}bias_filler {type: "constant"}}
}
layer {name: "pool2"type: "Pooling"bottom: "conv2"top: "pool2"pooling_param {pool: MAXkernel_size: 2stride: 2}
}
layer {name: "ip1"type: "InnerProduct"      // 全连接层,类似卷积层bottom: "pool2"top: "ip1"param {lr_mult: 1}param {lr_mult: 2}inner_product_param {num_output: 500weight_filler {type: "xavier"}bias_filler {type: "constant"}}
}
layer {name: "relu1"type: "ReLU"          // Relu层,激活函数bottom: "ip1"top: "ip1"
}
layer {name: "ip2"type: "InnerProduct"  // 全连接层bottom: "ip1"top: "ip2"param {lr_mult: 1}param {lr_mult: 2}inner_product_param {num_output: 10          // 分类数weight_filler {type: "xavier"}bias_filler {type: "constant"}}
}
layer {name: "accuracy"type: "Accuracy"      // Accuracy层,测试阶段查看训练精度bottom: "ip2"bottom: "label"top: "accuracy"include {phase: TEST}
}
layer {name: "loss"type: "SoftmaxWithLoss"   // Softmax层,分类作用bottom: "ip2"bottom: "label"top: "loss"
}

参数说明

卷积层Convolution

  • lr_mult

学习率的系数,最终的学习率是这个数乘以solver.prototxt配置文件中的base_lr。如果有两个lr_mult, 则第一个表示权值的学习率,第二个表示偏置项的学习率。一般偏置项的学习率是权值学习率的两倍。

  • num_output

卷积核(filter)的个数

  • kernel_size

卷积核的大小。如果卷积核的长和宽不等,需要用kernel_h和kernel_w分别设定

  • stride

卷积核的步长,默认为1。也可以用stride_h和stride_w来设置。

  • weight_filler

权值初始化。 默认为“constant”,值全为0,很多时候我们用”xavier”算法来进行初始化,也可以设置为”gaussian”

  • bias_filler

偏置项的初始化。一般设置为”constant”,值全为0。

池化层Pooling

  • kernel_size

必须设置的参数。池化的核大小。也可以用kernel_h和kernel_w分别设定。

  • pool

池化方法,默认为MAX。目前可用的方法有MAX, AVE, 或STOCHASTIC

  • stride

池化的步长,默认为1。一般我们设置为2,即不重叠。也可以用stride_h和stride_w来设置。

全连接层InnerProduct

参数同卷积层

Relu层

Accuracy层

SoftmaxWithLoss层

这篇关于经典模型之Lenet的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/837483

相关文章

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)

《C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)》本文主要介绍了C#集成DeepSeek模型实现AI私有化的方法,包括搭建基础环境,如安装Ollama和下载DeepS... 目录前言搭建基础环境1、安装 Ollama2、下载 DeepSeek R1 模型客户端 ChatBo

SpringBoot快速接入OpenAI大模型的方法(JDK8)

《SpringBoot快速接入OpenAI大模型的方法(JDK8)》本文介绍了如何使用AI4J快速接入OpenAI大模型,并展示了如何实现流式与非流式的输出,以及对函数调用的使用,AI4J支持JDK8... 目录使用AI4J快速接入OpenAI大模型介绍AI4J-github快速使用创建SpringBoot

0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型的操作流程

《0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeekR1模型的操作流程》DeepSeekR1模型凭借其强大的自然语言处理能力,在未来具有广阔的应用前景,有望在多个领域发... 目录0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型,3步搞定一个应

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll

Spring AI Alibaba接入大模型时的依赖问题小结

《SpringAIAlibaba接入大模型时的依赖问题小结》文章介绍了如何在pom.xml文件中配置SpringAIAlibaba依赖,并提供了一个示例pom.xml文件,同时,建议将Maven仓... 目录(一)pom.XML文件:(二)application.yml配置文件(一)pom.xml文件:首

如何在本地部署 DeepSeek Janus Pro 文生图大模型

《如何在本地部署DeepSeekJanusPro文生图大模型》DeepSeekJanusPro模型在本地成功部署,支持图片理解和文生图功能,通过Gradio界面进行交互,展示了其强大的多模态处... 目录什么是 Janus Pro1. 安装 conda2. 创建 python 虚拟环境3. 克隆 janus

本地私有化部署DeepSeek模型的详细教程

《本地私有化部署DeepSeek模型的详细教程》DeepSeek模型是一种强大的语言模型,本地私有化部署可以让用户在自己的环境中安全、高效地使用该模型,避免数据传输到外部带来的安全风险,同时也能根据自... 目录一、引言二、环境准备(一)硬件要求(二)软件要求(三)创建虚拟环境三、安装依赖库四、获取 Dee

DeepSeek模型本地部署的详细教程

《DeepSeek模型本地部署的详细教程》DeepSeek作为一款开源且性能强大的大语言模型,提供了灵活的本地部署方案,让用户能够在本地环境中高效运行模型,同时保护数据隐私,在本地成功部署DeepSe... 目录一、环境准备(一)硬件需求(二)软件依赖二、安装Ollama三、下载并部署DeepSeek模型选