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

雲水木石發表於2018-12-13

在硬體設計領域,模組化設計是通用的設計準則,特別是大規模積體電路出現之後,硬體工程師並不需要從頭設計,而是尋找合適的模組,將它們組合起來,完成所需的功能。軟體設計領域也同樣如此,比如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上可以做哪些事情。

探索和發現模組

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

圖1:提供了模組的詳細資訊、訪問其tfhub.devURL的簡便方法,還可以直接開啟Colab Notebook。

TensorFlow Hub是一個共享可重用機器學習模型的平臺,其願景是為研究人員和開發人員提供一種方便的方式分享他們的工作。每個模型都提供了詳細資料,包括簡介、開發者、類別、版本等,更重要的是提供了tfhub.dev URL的連結,甚至可以開啟對應的Colab Notebook,試用該模型。圖1中的 Universal Sentence Encoder模性就是這樣的一個成功範例,它讓開發社群可以儘快享用到最新的基礎機器學習研究成果。

搜尋和過濾

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

圖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的圖片,用於演示目標物件檢測。

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

圖3:用於物件檢測的圖片

將圖片的真實地址替換上述程式碼中的image_string,可以得到如下的結果:

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

圖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

相關文章