中文手写数据集训练识别

一、介绍

1、摘要:中文手写数据集是由 模式识别国家实验室(NLPR)和中国自动化研究所科学院(CASIA)共同整理的

    这个数据集是由171个字母数字字符和符号以及 3,866 中文汉字 (DB1.0) 或者3,755 中文汉字(DB1.1)组成/

2、工具网络参数可视化在线工具 http://ethereon.github.io/netscope/#/editor

二、使用vs2013 编译pycaffe(windows使用python是由caffe)并安装

1、python必须是python2.7 x64

2、编译release版本成功后把生成的caffe整个目录copy到python安装目录下的Lib\site-packages

3、安装caffe所需的库,具体需要什么库可以使用python自带的命令行 import caffe来检查,不报错表明安装成功(看图)


缺少的库可以到网站https://www.lfd.uci.edu/~gohlke/pythonlibs/来查找

备注:安装python扩展包使用命令 pip install xxxx

三、caffe工具

1、图片转换数据工具

格式:convert_imageset.exe [flags] [图片目录] [图片标签文件.txt] [输出数据文件]

          [flags]:--gray=false 是否是灰度图片

                        --shuffle=false 是否打乱顺序

                        --backend=lmdb 输出数据类型

                        --resize_width=0 修改图片的宽度 默认原宽度

                        --resize_height=0 修改图片的高度 默认原高度

                        --check_size=false 是否检查图片尺寸

                        --encoded=false 是否转换图片格式

                        --encode_type= 设置图片格式

            [图片目录]:txt文件中每行的格式是 “图片名 + 空格 + 标签”标签从0开始

        命令行例子:--gray=1 --shuffle=1 --backend=lmdb --resize_width=40 --resize_height=40 --check_size=0 --  encoded=0 \seg\ \imageLable.txt \xxxx_train_lmdb

2、生成均值文件

    格式:compute_image_mean.exe [flags] [数据文件] [输出均值文件(.proto)]

    [flags]: --backend=lmdb 数据类型

3、训练工具 (具体解释引用 https://www.cnblogs.com/denny402/p/5076285.html)

    格式:caffe.exe [flags] [train] [test] [device_query] [time]

        [flags]: -gpu: 可选参数。该参数用来指定用哪一块gpu运行,根据gpu的id进行选择,如果设置为'-gpu all'则使用所有的gpu运行。如使用第二块gpu运行

            # ./build/tools/caffe train -solver examples/mnist/lenet_solver.prototxt -gpu 2

                    --solver 必选参数。一个protocol buffer类型的文件,即模型的配置文件

             # ./build/tools/caffe train -solver examples/mnist/lenet_solver.prototxt

                    -snapshot:可选参数。该参数用来从快照(snapshot)中恢复训练。可以在solver配置文件设置快照,保存solverstate

                    

            ./build/tools/caffe train -solver examples/mnist/lenet_solver.prototxt -snapshot                 examples/mnist/lenet_iter_5000.solverstate

                    -weights:可选参数。用预先训练好的权重来fine-tuning模型,需要一个caffemodel,不能和-snapshot同时使用

             # ./build/tools/caffe train -solver examples/finetuning_on_flickr_style/solver.prototxt -weights               models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel

                    -iterations: 可选参数,迭代次数,默认为50。 如果在配置文件文件中没有设定迭代次数,则默认迭代50次

                    -model:可选参数,定义在protocol buffer文件中的模型。也可以在solver配置文件中指定

                    -sighup_effect:可选参数。用来设定当程序发生挂起事件时,执行的操作,可以设置为snapshot, stop或none, 默认为snapshot

                    -sigint_effect: 可选参数。用来设定当程序发生键盘中止事件时(ctrl+c), 执行的操作,可以设置为snapshot, stop或none, 默认为stop

                    刚才举例了一些train参数的例子,现在我们来看看其它三个<command>:

                    test参数用在测试阶段,用于最终结果的输出,要模型配置文件中我们可以设定需要输入accuracy还是loss. 假设我们要在验证集中验证已经训练好的模型,就可以这样写

# ./build/tools/caffe test -model examples/mnist/lenet_train_test.prototxt -weights examples/mnist/lenet_iter_10000.caffemodel -gpu 0 -iterations 100

这个例子比较长,不仅用到了test参数,还用到了-model, -weights, -gpu和-iteration四个参数。意思是利用训练好了的权重(-weight),输入到测试模型中(-model),用编号为0的gpu(-gpu)测试100次(-iteration)。

time参数用来在屏幕上显示程序运行时间。如:

# ./build/tools/caffe time -model examples/mnist/lenet_train_test.prototxt -iterations 10

这个例子用来在屏幕上显示lenet模型迭代10次所使用的时间。包括每次迭代的forward和backward所用的时间,也包括每层forward和backward所用的平均时间。

# ./build/tools/caffe time -model examples/mnist/lenet_train_test.prototxt -gpu 0

这个例子用来在屏幕上显示lenet模型用gpu迭代50次所使用的时间。

# ./build/tools/caffe time -model examples/mnist/lenet_train_test.prototxt -weights examples/mnist/lenet_iter_10000.caffemodel -gpu 0 -iterations 10

利用给定的权重,利用第一块gpu,迭代10次lenet模型所用的时间。

device_query参数用来诊断gpu信息。

# ./build/tools/caffe device_query -gpu 0

最后,我们来看两个关于gpu的例子

# ./build/tools/caffe train -solver examples/mnist/lenet_solver.prototxt -gpu 0,1
# ./build/tools/caffe train -solver examples/mnist/lenet_solver.prototxt -gpu all

这两个例子表示: 用两块或多块GPU来平行运算,这样速度会快很多。但是如果你只有一块或没有gpu, 就不要加-gpu参数了,加了反而慢。

最后,在linux下,本身就有一个time命令,因此可以结合进来使用,因此我们运行mnist例子的最终命令是(一块gpu):

4、识别工具

格式:classification.exe [deploy.prototxt文件] [训练好的.caffemodel文件] [均值.proto 文件] [标签.txt文件] [图片文件]

五、微调

(具体参见 http://blog.csdn.net/nongfu_spring/article/details/51514040和官方网址 http://caffe.berkeleyvision.org/gathered/examples/finetune_flickr_style.html)

1. ImageNet原来是1k个类别,finetune时需要根据自己数据集的类别数重新设置fc8层的output数,且新的fc8层的blob_lr会设的大一些(比如10和20),是为了加快收敛。

2. 如果你的网络中某一层的的参数个数变了,例如AlexNet全连接层输出为1000个,而你的网络只需要做2分类也就是输出两个值,那一定要把该层的 name 换一下,不然caffe 在 finetune 源网络的weight 的时候发现维度不匹配会报错的。

3. 自己数据集的类别号从0开始,中间要连续(我师弟有次finetune数据集一直报错,后来发现他是二类分类,但是类别号设成了0和12)


4. 数据集记得打乱,不然很可能不收敛


5. 如果出现不收敛的问题,可以把solver里的lr设的小一点,一般从0.01开始,如果出现loss=nan了就不断往小调整


6. 可以把accuracy和loss的曲线画出来,方便设定stepsize,一般在accuracy和loss都趋于平缓的时候就可以减小lr了

六、结果分析

1、train loss 不断下降,test loss不断下降,说明网络仍在学习;(最好的)

2、train loss 不断下降,test loss趋于不变,说明网络过拟合;(max pool或者正则化)

3、train loss 趋于不变,test loss不断下降,说明数据集100%有问题;(检查dataset)

4、train loss 趋于不变,test loss趋于不变,说明学习遇到瓶颈,需要减小学习率或批量数目;(减少学习率)

5、train loss 不断上升,test loss不断上升,说明网络结构设计不当,训练超参数设置不当,数据集经过清洗等问题。(最不好的情况)

七、caffe 代码解析

具体见 http://blog.csdn.net/jiongnima/article/details/55800959

八、mask-R-CNN 图像分割实现

具体见 http://blog.csdn.net/scutjy2015/article/details/78715737

九、windows_caffe 增加 rnn网络的方法

具体见:https://blog.csdn.net/zb1165048017/article/details/59112034

引用:论文来自 《Online and Offline Handwritten Chinese Character Recognition:Benchmarking on New Databases》

  • 3
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
好的,以下是用Jittor训练手写识别数据集的步骤: 1. 准备数据集:你可以使用MNIST数据集或者自己制作一个手写数字数据集。对于MNIST数据集,你可以使用以下代码来加载数据集: ```python import jittor.transform as transform from jittor.dataset.mnist import MNIST train_loader = MNIST(train=True, transform=transform.Compose([ transform.Resize(28), transform.ImageNormalize() ])) test_loader = MNIST(train=False, transform=transform.Compose([ transform.Resize(28), transform.ImageNormalize() ])) ``` 2. 定义模型:你可以选择使用卷积神经网络(CNN)或者全连接神经网络(FNN)。以下是一个简单的CNN模型: ```python import jittor as jt class Net(jt.Module): def __init__(self): self.conv1 = jt.nn.Conv(1, 10, kernel_size=5) self.conv2 = jt.nn.Conv(10, 20, kernel_size=5) self.fc1 = jt.nn.Linear(320, 50) self.fc2 = jt.nn.Linear(50, 10) def execute(self, x): x = jt.relu(jt.max_pool2d(self.conv1(x), 2)) x = jt.relu(jt.max_pool2d(self.conv2(x), 2)) x = x.view(x.size(0), -1) x = jt.relu(self.fc1(x)) x = self.fc2(x) return x ``` 3. 定义损失函数和优化器:你可以选择使用交叉熵损失函数和随机梯度下降(SGD)优化器。 ```python loss_fn = jt.nn.CrossEntropyLoss() optimizer = jt.optim.SGD(net.parameters(), lr=0.01, momentum=0.5) ``` 4. 训练模型:使用以下代码训练模型。 ```python for epoch in range(10): total_loss = 0.0 for i, (inputs, targets) in enumerate(train_loader): optimizer.zero_grad() outputs = net(inputs) loss = loss_fn(outputs, targets) loss.backward() optimizer.step() total_loss += loss.item() print("Epoch {}, loss={}".format(epoch+1, total_loss/(i+1))) ``` 5. 测试模型:使用以下代码测试模型。 ```python correct = 0 total = 0 with jt.no_grad(): for i, (inputs, targets) in enumerate(test_loader): outputs = net(inputs) _, predicted = jt.max(outputs.data, 1) total += targets.size(0) correct += (predicted == targets).sum().item() print("Accuracy: {}%".format(100*correct/total)) ``` 这样,你就可以用Jittor训练手写识别数据集了!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值