在硬件设计领域,模块化设计是通用的设计准则,特别是大规模集成电路出现以后,硬件工程师并不须要从头设计,而是寻找合适的模块,将它们组合起来,完成所需的功能。软件设计领域也一样如此,好比Windows时代的COM组件、中间件,等等。固然,因为软件的灵活性和复杂性,没法作到像硬件领域集成度那么高,但这种思想始终会影响到软件设计方式。好比今天,作前端的软件设计人员,可能会在代码中用到JQuery、Bootstrap等框架。Android开发人员可能会使用Taurus、ActionBarSherlock、Android-Universal-Image-Loader之类的UI组件。前端
机器学习是一个近几年来迅速崛起的领域,获得了广大开发人员的关注。然而,开发出一个新的机器模型并不容易,首先须要深厚的机器学习理论知识,其次须要大量的训练数据(对于深度学习,尤为如此),最后,训练一个模型每每须要消耗大量的运算力,特别是对GPU的要求很是高。固然,机器学习也属于软件设计领域,因此采用组件化模式也是天然而然的方法。python
机器学习能够在三个层次上进行模块化:git
组件所在的层级越高,接口越简单,使用越方便,但灵活度下降,只适合很是通用的场景。层级越低,灵活性越高,但编写和训练模型就越复杂。因此处在中间层级的模型组件化可以在复杂性和灵活性之间取得很好的平衡。github
TensorFlow Hub是一个发布、发现和重用TensorFlow模型的平台,致力于TensorFlow机器学习模型的组件化。很重要的是TensorFlow Hub基于Web技术,开发者只须要经过浏览器就能够搜索、浏览TensorFlow模型。下面咱们来看看在TensorFlow Hub上能够作哪些事情。web
图1:提供了模块的详细信息、访问其tfhub.devURL的简便方法,还能够直接打开Colab Notebook。算法
TensorFlow Hub是一个共享可重用机器学习模型的平台,其愿景是为研究人员和开发人员提供一种方便的方式分享他们的工做。每一个模型都提供了详细资料,包括简介、开发者、类别、版本等,更重要的是提供了tfhub.dev URL的连接,甚至能够打开对应的Colab Notebook,试用该模型。图1中的 Universal Sentence Encoder模性就是这样的一个成功范例,它让开发社区能够尽快享用到最新的基础机器学习研究成果。浏览器
图2:查找使用西班牙语数据训练的文本嵌入模型session
若是你有明确的需求,正在寻找合适的机器学习模型,你能够在TF Hub上搜索和过滤。上图展示了如何搜索文本嵌入模型,并按照语言(西班牙语)进行过滤,这样查找到的模型就限定于西班牙语数据集上训练的NNLM模型。框架
出于商业缘由,有可能你所开发的机器学习模型并不会公开发布,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:模型推断出的边界框和类别
完整代码请参考:github.com/mogoweb/aie…
TF Hub上有用的模型还有不少,好比:
固然,还有更多的模型等待着你去发现。
个人更多关于TensorFlow的文章: