Press "Enter" to skip to content

TensorFlow Hub:探索机器学习组件化

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

在硬件设计领域,模块化设计是通用的设计准则,特别是大规模集成电路出现之后,硬件工程师并不需要从头设计,而是寻找合适的模块,将它们组合起来,完成所需的功能。软件设计领域也同样如此,比如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 Web Experience

Be First to Comment

发表评论

电子邮件地址不会被公开。 必填项已用*标注