TensorFlow Hub:探索機器學習組件化

在硬件設計領域,模塊化設計是通用的設計準則,特別是大規模集成電路出現以後,硬件工程師並不須要從頭設計,而是尋找合適的模塊,將它們組合起來,完成所需的功能。軟件設計領域也一樣如此,好比Windows時代的COM組件、中間件,等等。固然,因爲軟件的靈活性和複雜性,沒法作到像硬件領域集成度那麼高,但這種思想始終會影響到軟件設計方式。好比今天,作前端的軟件設計人員,可能會在代碼中用到JQuery、Bootstrap等框架。Android開發人員可能會使用Taurus、ActionBarSherlock、Android-Universal-Image-Loader之類的UI組件。前端

機器學習是一個近幾年來迅速崛起的領域,獲得了廣大開發人員的關注。然而,開發出一個新的機器模型並不容易,首先須要深厚的機器學習理論知識,其次須要大量的訓練數據(對於深度學習,尤爲如此),最後,訓練一個模型每每須要消耗大量的運算力,特別是對GPU的要求很是高。固然,機器學習也屬於軟件設計領域,因此採用組件化模式也是天然而然的方法。python

機器學習能夠在三個層次上進行模塊化:git

  • 最上面一層,應用層,能夠提供高度封裝好的功能接口,使用者甚至無需任何機器學習背景知識,對外接口也能夠看不出採用了機器學習算法。好比,face++提供的人臉識別、阿里雲提供的鑑黃服務等等。
  • 在最底層面,框架層,能夠提供梯度遞減算法、softmax、卷積運算等等,這些是構建深度學習必要的基礎組件,但開發者必須設計模型、訓練模型,須要有深厚的機器學習背景知識,以及大量的數據。
  • 在中間層,能夠提供訓練好的模型,使用者能夠在項目中直接加載模型,也能夠在本身的數據集上對模型進行再訓練,實現個性化需求。這種方法再也不須要海量數據,就能夠得到不錯的性能。

組件所在的層級越高,接口越簡單,使用越方便,但靈活度下降,只適合很是通用的場景。層級越低,靈活性越高,但編寫和訓練模型就越複雜。因此處在中間層級的模型組件化可以在複雜性和靈活性之間取得很好的平衡。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 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:模型推斷出的邊界框和類別

完整代碼請參考:github.com/mogoweb/aie…

TF Hub上有用的模型還有不少,好比:

  • 2017年iNaturalist Kaggle挑戰賽的獲獎者發表了一篇描述他們的方法的論文,並在TensorFlow Hub上發佈了他們的模型,展現了遷移學習的優點。
  • 來自TensorFlow Hub團隊的Jeremiah Harmsen發佈了一個Kaggle示例,演示瞭如何利用TensorFlow Hub的預訓練模塊來解決Kaggle上的情緒分析挑戰。

固然,還有更多的模型等待着你去發現。

參考

  1. A New TensorFlow Hub Web Experience

個人更多關於TensorFlow的文章:

image
相關文章
相關標籤/搜索