内容简介:在硬件设计领域,模块化设计是通用的设计准则,特别是大规模集成电路出现之后,硬件工程师并不需要从头设计,而是寻找合适的模块,将它们组合起来,完成所需的功能。软件设计领域也同样如此,比如Windows时代的COM组件、中间件,等等。当然,由于软件的灵活性和复杂性,无法做到像硬件领域集成度那么高,但这种思想始终会影响到软件设计方式。比如今天,做前端的软件设计人员,可能会在代码中用到JQuery、Bootstrap等框架。Android开发人员可能会使用Taurus、ActionBarSherlock、Andro
在硬件设计领域,模块化设计是通用的设计准则,特别是大规模集成电路出现之后,硬件工程师并不需要从头设计,而是寻找合适的模块,将它们组合起来,完成所需的功能。软件设计领域也同样如此,比如Windows时代的COM组件、中间件,等等。当然,由于软件的灵活性和复杂性,无法做到像硬件领域集成度那么高,但这种思想始终会影响到软件设计方式。比如今天,做前端的软件设计人员,可能会在代码中用到JQuery、Bootstrap等框架。Android开发人员可能会使用Taurus、ActionBarSherlock、Android-Universal-Image-Loader之类的UI组件。
机器学习是一个近几年来迅速崛起的领域,得到了广大开发人员的关注。然而,开发出一个新的机器模型并不容易,首先需要深厚的机器学习理论知识,其次需要大量的训练数据(对于深度学习,尤其如此),最后,训练一个模型往往需要消耗大量的运算力,特别是对GPU的要求非常高。当然,机器学习也属于软件设计领域,所以采用组件化模式也是自然而然的方法。
机器学习可以在三个层次上进行模块化:
-
最上面一层,应用层,可以提供高度封装好的功能接口,使用者甚至无需任何机器学习背景知识,对外接口也可以看不出采用了机器学习算法。比如,face++提供的人脸识别、阿里云提供的鉴黄服务等等。
-
在最底层面,框架层,可以提供梯度递减算法、softmax、卷积运算等等,这些是构建深度学习必要的基础组件,但开发者必须设计模型、训练模型,需要有深厚的机器学习背景知识,以及大量的数据。
-
在中间层,可以提供训练好的模型,使用者可以在项目中直接加载模型,也可以在自己的数据集上对模型进行再训练,实现个性化需求。这种方法不再需要海量数据,就可以获得不错的性能。
组件所在的层级越高,接口越简单,使用越方便,但灵活度降低,只适合非常通用的场景。层级越低,灵活性越高,但编写和训练模型就越复杂。所以处在中间层级的模型组件化能够在复杂性和灵活性之间取得很好的平衡。
TensorFlow Hub是一个发布、发现和重用TensorFlow模型的平台,致力于TensorFlow机器学习模型的组件化。很重要的是TensorFlow Hub基于Web技术,开发者只需要通过浏览器就可以搜索、浏览TensorFlow模型。下面我们来看看在TensorFlow Hub上可以做哪些事情。
探索和发现模块
图1:提供了模块的详细信息、访问其tfhub.devURL的简便方法,还可以直接打开Colab Notebook。
TensorFlow Hub是一个共享可重用机器学习模型的平台,其愿景是为研究人员和开发人员提供一种方便的方式分享他们的工作。每个模型都提供了详细资料,包括简介、开发者、类别、版本等,更重要的是提供了tfhub.dev URL的链接,甚至可以打开对应的Colab Notebook,试用该模型。图1中的 Universal Sentence Encoder模性就是这样的一个成功范例,它让开发社区可以尽快享用到最新的基础机器学习研究成果。
搜索和过滤
图2:查找使用西班牙语数据训练的文本嵌入模型
如果你有明确的需求,正在寻找合适的机器学习模型,你可以在TF Hub上搜索和过滤。上图展现了如何搜索文本嵌入模型,并按照语言(西班牙语)进行过滤,这样查找到的模型就限定于西班牙语数据集上训练的NNLM模型。
适用于产品团队的TensorFlow Hub
出于商业原因,有可能你所开发的机器学习模型并不会公开发布,TensorFlow开发团队也考虑到了这一需求。除了可以使用在https://tfhub.dev上发布的模型之外,TensorFlow Hub库还允许你将模型发布到私有存储并使用,这样模型可以为团队所共享,而又无需对外发布。
在代码上非常简,使用文件系统路径代替tfhub.dev URL引用模块即可:
m = hub.Module("/tmp/text-embedding") embeddings = m(sentences)
如何开始
以目前最常见的应用-目标对象检测为例,我们可以使用Google和DeepMind团队最新发布的在Open Images v4数据集上训练的FasterRCNN模型。 我们只需要寥寥几行代码就可以加载模型,实现对象检测:
with tf.Graph().as_default(): detector = hub.Module("https://tfhub.dev/google/faster_rcnn/openimages_v4/inception_resnet_v2/1") image_string_placeholder = tf.placeholder(tf.string) decoded_image = tf.image.decode_jpeg(image_string_placeholder) # Module accepts as input tensors of shape [1, height, width, 3], i.e. batch # of size 1 and type tf.float32. decoded_image_float = tf.image.convert_image_dtype( image=decoded_image, dtype=tf.float32) module_input = tf.expand_dims(decoded_image_float, 0) result = detector(module_input, as_dict=True) init_ops = [tf.global_variables_initializer(), tf.tables_initializer()] session = tf.Session() session.run(init_ops) # Load the downloaded and resized image and feed into the graph. with tf.gfile.Open(downloaded_image_path, "rb") as binfile: image_string = binfile.read() result_out, image_out = session.run( [result, decoded_image], feed_dict={image_string_placeholder: image_string}) print("Found %d objects." % len(result_out["detection_scores"])) image_with_boxes = draw_boxes( np.array(image_out), result_out["detection_boxes"], result_out["detection_class_entities"], result_out["detection_scores"]) display_image(image_with_boxes)
下图是一张来自unsplash.com的图片,用于演示目标对象检测。
图3:用于对象检测的图片
将图片的真实地址替换上述代码中的image_string,可以得到如下的结果:
图4:模型推断出的边界框和类别
完整代码请参考:https://github.com/mogoweb/aiexamples
TF Hub上有趣的模型还有很多,比如:
-
2017年iNaturalist Kaggle挑战赛的获奖者发表了一篇描述他们的方法的论文,并在TensorFlow Hub上发布了他们的模型,展示了迁移学习的优势。
-
来自TensorFlow Hub团队的Jeremiah Harmsen发布了一个Kaggle示例,演示了如何利用TensorFlow Hub的预训练模块来解决Kaggle上的情绪分析挑战。
当然,还有更多的模型等待着你去发现。
参考
-
A New TensorFlow Hub Web Experience
我的更多关于TensorFlow的文章:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 组件化之路—集成组件SDK
- Android组件化入门:一步步搭建组件化架构
- Android快速开发框架,基础库,样式库,组件化,组件集成
- Android组件化方案及组件消息总线modular-event实战
- 组件化实践
- 组件化架构漫谈
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
现代前端技术解析
张成文 / 电子工业出版社 / 2017-4-1 / 79.00元
这是一本以现代前端技术思想与理论为主要内容的书。前端技术发展迅速,涉及的技术点很多,我们往往需要阅读很多书籍才能理解前端技术的知识体系。《现代前端技术解析》在前端知识体系上做了很好的总结和梳理,涵盖了现代前端技术绝大部分的知识内容,起到一个启蒙作用,能帮助读者快速把握前端技术的整个脉络,培养更完善的体系化思维,掌握更多灵活的前端代码架构方法,使读者获得成为高级前端工程师或架构师所必须具备的思维和能......一起来看看 《现代前端技术解析》 这本书的介绍吧!