摘要:LeNet-5是Yann LeCun在1998年设计的用于手写数字识别的卷积神经网络,当年美国大多数银行就是用它来识别支票上面的手写数字的,它是早期卷积神经网络中最有代表性的实验系统之一。可以说,LeNet-5就相当于编程语言入门中的“Hello world!”。

华为的昇腾训练芯片一直是大家所期待的,目前已经开始提供公测,如何在昇腾训练芯片上运行一个训练任务,这是目前很多人都在采坑过程中,所以我写了一篇指导文章,附带上所有相关源代码。注意,本文并没有包含环境的安装,请查看另外相关文档。

环境约束:昇腾910目前仅配套TensorFlow 1.15版本。

基础镜像上传之后,我们需要启动镜像命令,以下命令挂载了8块卡(单机所有卡):

docker run -it --net=host --device=/dev/davinci0 --device=/dev/davinci1 --device=/dev/davinci2 --device=/dev/davinci3 --device=/dev/davinci4 --device=/dev/davinci5 --device=/dev/davinci6 --device=/dev/davinci7 --device=/dev/davinci_manager --device=/dev/devmm_svm --device=/dev/hisi_hdc -v /var/log/npu/slog/container/docker:/var/log/npu/slog -v /var/log/npu/conf/slog/slog.conf:/var/log/npu/conf/slog/slog.conf -v /usr/local/Ascend/driver/lib64/:/usr/local/Ascend/driver/lib64/ -v /usr/local/Ascend/driver/tools/:/usr/local/Ascend/driver/tools/ -v /data/:/data/ -v /home/code:/home/local/code -v ~/context:/cache  ubuntu_18.04-docker.arm64v8:v2  /bin/bash

设置环境变量并启动手写字训练网络:

#!/bin/bashexport LD_LIBRARY_PATH=/usr/local/lib/:/usr/local/HiAI/runtime/lib64export PATH=/usr/local/HiAI/runtime/ccec_compiler/bin:$PATHexport CUSTOM_OP_LIB_PATH=/usr/local/HiAI/runtime/ops/framework/built-in/tensorflowexport DDK_VERSION_PATH=/usr/local/HiAI/runtime/ddk_infoexport WHICH_OP=GEOPexport NEW_GE_FE_ID=1export GE_AICPU_FLAG=1export OPTION_EXEC_EXTERN_PLUGIN_PATH=/usr/local/HiAI/runtime/lib64/plugin/opskernel/libfe.so:/usr/local/HiAI/runtime/lib64/plugin/opskernel/libaicpu_plugin.so:/usr/local/HiAI/runtime/lib64/plugin/opskernel/libge_local_engine.so:/usr/local/HiAI/runtime/lib64/plugin/opskernel/librts_engine.so:/usr/local/HiAI/runtime/lib64/libhccl.soexport OP_PROTOLIB_PATH=/usr/local/HiAI/runtime/ops/built-in/export DEVICE_ID=2export PRINT_MODEL=1#export DUMP_GE_GRAPH=2#export DISABLE_REUSE_MEMORY=1#export DUMP_OP=1#export SLOG_PRINT_TO_STDOUT=1export RANK_ID=0export RANK_SIZE=1export JOB_ID=10087export OPTION_PROTO_LIB_PATH=/usr/local/HiAI/runtime/ops/op_proto/built-in/export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/Ascend/fwkacllib/lib64/:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/export PYTHONPATH=$PYTHONPATH:/usr/local/Ascend/opp/op_impl/built-in/ai_core/tbeexport PATH=$PATH:/usr/local/Ascend/fwkacllib/ccec_compiler/binexport ASCEND_HOME=/usr/local/Ascendexport ASCEND_OPP_PATH=/usr/local/Ascend/oppexport SOC_VERSION=Ascend910rm -f *.pbtxtrm -f *.txtrm -r /var/log/npu/slog/*.logrm -rf train_url/*python3 mnist_train.py

以下训练案例中我使用的lecun大师的LeNet-5网络,先简单介绍LeNet-5网络:

LeNet5诞生于1994年,是最早的卷积神经网络之一,并且推动了深度学习领域的发展。自从1988年开始,在多年的研究和许多次成功的迭代后,这项由Yann LeCun完成的开拓性成果被命名为LeNet5。

LeNet-5包含七层,不包括输入,每一层都包含可训练参数(权重),当时使用的输入数据是32*32像素的图像。下面逐层介绍LeNet-5的结构,并且,卷积层将用Cx表示,子采样层则被标记为Sx,完全连接层被标记为Fx,其中x是层索引。

层C1是具有六个5*5的卷积核的卷积层(convolution),特征映射的大小为28*28,这样可以防止输入图像的信息掉出卷积核边界。C1包含156个可训练参数和122304个连接。

层S2是输出6个大小为14*14的特征图的子采样层(subsampling/pooling)。每个特征地图中的每个单元连接到C1中的对应特征地图中的2*2个邻域。S2中单位的四个输入相加,然后乘以可训练系数(权重),然后加到可训练偏差(bias)。结果通过S形函数传递。由于2*2个感受域不重叠,因此S2中的特征图只有C1中的特征图的一半行数和列数。S2层有12个可训练参数和5880个连接。

层C3是具有16个5-5的卷积核的卷积层。前六个C3特征图的输入是S2中的三个特征图的每个连续子集,接下来的六个特征图的输入则来自四个连续子集的输入,接下来的三个特征图的输入来自不连续的四个子集。最后,最后一个特征图的输入来自S2所有特征图。C3层有1516个可训练参数和156 000个连接。

层S4是与S2类似,大小为2*2,输出为16个5*5的特征图。S4层有32个可训练参数和2000个连接。

层C5是具有120个大小为5*5的卷积核的卷积层。每个单元连接到S4的所有16个特征图上的5*5邻域。这里,因为S4的特征图大小也是5*5,所以C5的输出大小是1*1。因此S4和C5之间是完全连接的。C5被标记为卷积层,而不是完全连接的层,是因为如果LeNet-5输入变得更大而其结构保持不变,则其输出大小会大于1*1,即不是完全连接的层了。C5层有48120个可训练连接。

F6层完全连接到C5,输出84张特征图。它有10164个可训练参数。这里84与输出层的设计有关。

LeNet的设计较为简单,因此其处理复杂数据的能力有限;此外,在近年来的研究中许多学者已经发现全连接层的计算代价过大,而使用全部由卷积层组成的神经网络。

LeNet-5网络训练脚本是mnist_train.py,具体代码:

import osimport numpy as npimport tensorflow as tfimport timefrom tensorflow.examples.tutorials.mnist import input_dataimport mnist_inferencefrom npu_bridge.estimator import npu_ops #导入NPU算子库from tensorflow.core.protobuf.rewriter_config_pb2 import RewriterConfig #重写tensorFlow里的配置,针对NPU的配置batch_size = 100learning_rate = 0.1training_step = 10000model_save_path = "./model/"model_name = "model.ckpt"def train(mnist):x = tf.placeholder(tf.float32, [batch_size, mnist_inference.image_size, mnist_inference.image_size, mnist_inference.num_channels], name = 'x-input')y_ = tf.placeholder(tf.float32, [batch_size, mnist_inference.num_labels], name = "y-input")regularizer = tf.contrib.layers.l2_regularizer(0.001)y = mnist_inference.inference(x, train = True, regularizer = regularizer) #推理过程global_step = tf.Variable(0, trainable=False)cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits = y, labels = tf.argmax(y_, 1)) #损失函数cross_entropy_mean = tf.reduce_mean(cross_entropy)loss = cross_entropy_mean + tf.add_n(tf.get_collection("loss"))train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss, global_step = global_step) #优化器调用saver = tf.train.Saver() #启动训练

#以下代码是NPU所必须的代码,开始配置参数

    config = tf.ConfigProto(allow_soft_placement = True,log_device_placement = False)custom_op =  config.graph_options.rewrite_options.custom_optimizers.add()custom_op.name =  "NpuOptimizer"custom_op.parameter_map["use_off_line"].b = True#custom_op.parameter_map["profiling_mode"].b = True#custom_op.parameter_map["profiling_options"].s = tf.compat.as_bytes("task_trace:training_trace")config.graph_options.rewrite_options.remapping = RewriterConfig.OFF

#配置参数结束

    writer = tf.summary.FileWriter("./log_dir", tf.get_default_graph())writer.close()

#参数初始化

    with tf.Session(config = config) as sess:tf.global_variables_initializer().run()start_time = time.time()for i in range(training_step):xs, ys = mnist.train.next_batch(batch_size)reshaped_xs = np.reshape(xs, (batch_size, mnist_inference.image_size, mnist_inference.image_size, mnist_inference.num_channels))_, loss_value, step = sess.run([train_step, loss, global_step], feed_dict={x:reshaped_xs, y_:ys})

#每训练10个epoch打印损失函数输出日志

            if i % 10 == 0:print("****************************++++++++++++++++++++++++++++++++*************************************\n" * 10)print("After %d training steps, loss on training batch is %g, total time in this 1000 steps is %s." % (step, loss_value, time.time() - start_time))#saver.save(sess, os.path.join(model_save_path, model_name), global_step = global_step)print("****************************++++++++++++++++++++++++++++++++*************************************\n" * 10)start_time = time.time()def main():mnist = input_data.read_data_sets('MNIST_DATA/', one_hot= True)train(mnist)if __name__ == "__main__":main()

本文主要讲述了经典卷积神经网络之LeNet-5网络模型和迁移至昇腾D910的实现,希望大家快来动手操作一下试试看!

点击这里→了解更多精彩内容

相关推荐

序列特征的处理方法之二:基于卷积神经网络方法

昇腾AI处理器软件栈--神经网络软件架构

机器学习笔记(八)---- 神经网络

94页论文综述卷积神经网络:从基础技术到研究前景

卷积神经网络CNN原理详解(一)——基本原理(2)

【华为云技术分享】干货!!卷积神经网络之LeNet-5迁移实践案例相关推荐

  1. 【华为云技术分享】气象模拟WRF容器化操作实践

    [摘要] WRF全称Weather Research and Forecasting Model, 是一个天气研究与预报模型的软件.咱们使用Docker容器化的方式走一个,方便使用. 1      W ...

  2. 【华为云技术分享】网络场景AI模型训练效率实践

    问题 在网络场景下的AI模型训练的过程中,KPI异常检测项目需要对设备内多模块.多类型数据,并根据波形以及异常表现进行分析,这样的数据量往往较大,对内存和性能要求较高. 同时,在设计优化算法时,需要快 ...

  3. 【华为云技术分享】三大前端技术(React,Vue,Angular)探密(下)

    [华为云技术分享]三大前端技术(React,Vue,Angular)探密(上) [Angular] Angular(通常被称为 "Angular 2+"或 "Angula ...

  4. 【华为云技术分享】“技术-经济范式”视角下的开源软件演进剖析-part 1

    前言 以互联网为代表的信息技术的迅猛发展对整个经济体系产生了巨大的影响.信息技术的发展一方面使知识的积累和传播更加迅速,知识爆炸性的增长:另一方面,使信息的获取变得越来越容易,信息交流的强度逐渐增加, ...

  5. 【华为云技术分享】“技术-经济范式”视角下的开源软件演进剖析-part 3

    4. 微观层面 4.1 个体动机 在开源软件发展之初, 商业组织的投入很少甚至没有, 完全是靠Richard Stallman 或者 linus Torvalds 这样的个人在努力推动开源软件艰难前行 ...

  6. 【华为云技术分享】在 K8S 大规模场景下 Service 性能如何优化?

    摘要:Kubernetes 原生的 Service 负载均衡基于 Iptables 实现,其规则链会随 Service 的数量呈线性增长,在大规模场景下对 Service 性能影响严重.本文分享了华为 ...

  7. 【华为云技术分享】直播回顾丨激发数据裂变新动能,HDC.Cloud云数据库前沿技术解读

    3月24日14:00-17:00,HDC.Cloud开发者沙龙系列云数据库专场直播线上开启,此次华为云数据库通过三场直播从NoSQL数据库新技术.数据库迁移.行业解决方案等方面对云端数据库进行深度解读 ...

  8. 【华为云技术分享】云小课 | 迁移第三方云厂商数据至OBS,两种方式任你选

    如何将我在第三方云厂商对象存储上的数据迁移至华为云OBS?华为云主要提供对象存储迁移服务(Object Storage Migration Service,OMS)和云数据迁移(Cloud Data ...

  9. DL之CNN优化技术:学习卷积神经网络CNN的优化、实践经验(练习调参)、从代码深刻认知CNN架构之练习技巧

    DL之CNN优化技术:学习卷积神经网络CNN的优化.调参实践.从代码深刻认知CNN架构之练习技巧 目录 卷积神经网络CNN调参学习实践 练习技巧 1.练习攻略一 2.VGG16练习攻略二 卷积神经网络 ...

最新文章

  1. 算法证明:女生遇到心动的男人一定要追!
  2. 记一次坑爹的 “跨域” 问题
  3. ‘FactorAnalyzer‘ object has no attribute ‘analyze‘和fa.loadings改成fa.loadings报错解决
  4. 大促密集,CDN如何保障电商体验如丝般顺滑?
  5. Oracle goldengate 11g错误汇总
  6. Oracle中table变量在JDBC中的运用
  7. java 根据类名示例化类_Java类类getEnclosingClass()方法及示例
  8. ajax传值给java_java+jquery+ajax+json实现传值
  9. AndroidStudio_使用gradle编译代码_打包apk_以及各种打包配置---Android原生开发工作笔记79
  10. LeetCode(1047)——删除字符串中的所有相邻重复项(JavaScript)
  11. Java八种基本数据类型的大小,以及封装类,自动装箱/拆箱的用法?
  12. HashSet中add的执行过程
  13. 工具篇:金蝶K3工具下载
  14. 恩智浦智能车一些常见的问题
  15. at24c32 linux,AT24C32使用方法总结
  16. 电脑耳机电流声的消除2021-09-11
  17. Animated之基础篇-概述
  18. Anaconda 安装使用
  19. 排序---小白鼠排队
  20. 再回首2014的精彩

热门文章

  1. 树莓派4B Raspbian-buster 更换源
  2. CAN笔记(18) 对象字典
  3. A*算法(一)算法导言
  4. oracle数据库启动多个监听,一台Oracle数据库服务器上两个监听同时使用
  5. 位运算符取反_Java常见的运算符——位运算
  6. (专题四)01 二维曲线
  7. 渗透测试学习 十一、 其他注入漏洞汇总
  8. labelImg 工具
  9. Git分布式版本管理
  10. 十六进制报文用wireshark打开