一行代碼切換TensorFlow與PyTorch,模型訓練也能用倆框架

2020-12-11 機器之心Pro

機器之心報導

參與:思源

你是否有時要用 PyTorch,有時又要跑 TensorFlow?這個項目就是你需要的,你可以在訓練中同時使用兩個框架,並端到端地轉換模型。也就是說 TensorFlow 寫的計算圖可以作為某個函數,直接應用到 Torch 的張量上,這操作也是很厲害了。

在早兩天開源的 TfPyTh 中,不論是 TensorFlow 還是 PyTorch 計算圖,它們都可以包裝成一個可微函數,並在另一個框架中高效完成前向與反向傳播。很顯然,這樣的框架交互,能節省很多重寫代碼的麻煩事。

github項目地址:BlackHC/TfPyTh

為什麼框架間的交互很重要

目前 GitHub 上有很多優質的開源模型,它們大部分都是用 PyTorch 和 TensorFlow 寫的。如果我們想要在自己的項目中調用某個開源模型,那麼它們最好都使用相同的框架,不同框架間的對接會帶來各種問題。當然要是不怕麻煩,也可以用不同的框架重寫一遍。

以前 TensorFlow 和 PyTorch 經常會用來對比,討論哪個才是更好的深度學習框架。但是它們之間就不能友好相處麼,模型在兩者之間的相互遷移應該能帶來更多的便利。

在此之前,Facebook 和微軟就嘗試過另一種方式,即神經網絡交換格式 ONNX。直觀而言,該工具定義了一種通用的計算圖,不同深度學習框架構建的計算圖都能轉化為它。雖然目前 ONNX 已經原生支持 MXNet、PyTorch 和 Caffe2 等大多數框架,但是像 TensorFlow 或 Keras 之類的只能通過第三方轉換器轉換為 ONNX 格式。

而且比較重要的一點是,現階段 ONNX 只支持推理,導入的模型都需要在原框架完成訓練。所以,想要加入其它框架的模型,還是得手動轉寫成相同框架,再執行訓練。

神奇的轉換庫 TfPyTh

既然 ONNX 無法解決訓練問題,那麼就輪到 TfPyTh 這類項目出場了,它無需改寫已有的代碼就能在框架間自由轉換。具體而言,TfPyTh 允許我們將 TensorFlow 計算圖包裝成一個可調用、可微分的簡單函數,然後 PyTorch 就能直接調用它完成計算。反過來也是同樣的,TensorFlow 也能直接調用轉換後的 PyTorch 計算圖。

因為轉換後的模塊是可微的,那么正向和反向傳播都沒什麼問題。不過項目作者也表示該項目還不太完美,開源 3 天以來會有一些小的問題。例如張量必須通過 CPU 進行複製與路由,直到 TensorFlow 支持__cuda_array_interface 相關功能才能解決。

目前 TfPyTh 主要支持三大方法:

torch_from_tensorflow:創建一個 PyTorch 可微函數,並給定 TensorFlow 佔位符輸入計算張量輸出;eager_tensorflow_from_torch:從 PyTorch 創建一個 Eager TensorFlow 函數;tensorflow_from_torch:從 PyTorch 創建一個 TensorFlow 運算子或張量。TfPyTh 示例

如下所示為 torch_from_tensorflow 的使用案例,我們會用 TensorFlow 創建一個簡單的靜態計算圖,然後傳入 PyTorch 張量進行計算。

import tensorflow as tfimport torch as thimport numpy as npimport tfpythsession = tf.Session()defget_torch_function(): a = tf.placeholder(tf.float32, name='a') b = tf.placeholder(tf.float32, name='b') c = 3 * a + 4 * b * b f = tfpyth.torch_from_tensorflow(session, [a, b], c).applyreturn ff = get_torch_function()a = th.tensor(1, dtype=th.float32, requires_grad=True)b = th.tensor(3, dtype=th.float32, requires_grad=True)x = f(a, b)assert x == 39.x.backward()assert np.allclose((a.grad, b.grad), (3., 24.))

我們可以發現,基本上 TensorFlow 完成的就是一般的運算,例如設置佔位符和建立計算流程等。TF 的靜態計算圖可以通過 session 傳遞到 TfPyTh 庫中,然後就產生了一個新的可微函數。後面我們可以將該函數用於模型的某個計算部分,再進行訓練也就沒什麼問題了。

相關焦點

  • 模型秒變API只需一行代碼,支持TensorFlow等框架
    選自GitHub機器之心編譯參與:一鳴、杜偉還在為機器學習模型打包成 API 發愁?這個工具能讓你一行代碼直接打包。專注於機器學習應用的人們知道,從訓練好的模型到實際的工業生產工具還有一定的距離。其中工作量很大的地方在於將模型打包,預留 API 接口,並和現有的生產系統相結合。近日,GitHub 上有了這樣一個項目,能夠讓用戶一行代碼將任意模型打包為 API。這一工具無疑能夠幫助開發者在實際的生產應用中快速部署模型。
  • TensorFlow 與 PyTorch 之爭
    訓練後的模型可以用在不同的應用中,比如目標檢測、圖像語義分割等等。儘管神經網絡架構可以基於任何框架實現,但結果卻並不一樣。訓練過程有大量參數都與框架息息相關。舉個例子,如果你在 PyTorch 上訓練一個數據集,那麼你可以使用 GPU 來增強其訓練過程,因為它們運行在 CUDA(一種 C++ 後端)上。TensorFlow 也能使用 GPU,但它使用的是自己內置的 GPU 加速。
  • TensorFlow與PyTorch之爭,哪個框架最適合深度學習
    訓練後的模型可以用在不同的應用中,比如目標檢測、圖像語義分割等等。儘管神經網絡架構可以基於任何框架實現,但結果卻並不一樣。訓練過程有大量參數都與框架息息相關。舉個例子,如果你在 PyTorch 上訓練一個數據集,那麼你可以使用 GPU 來增強其訓練過程,因為它們運行在 CUDA(一種 C++ 後端)上。
  • 初學AI神經網絡應該選擇Keras或是Pytorch框架?
    對於許多開發者來說,TensorFlow是他們接觸的第一個機器學習框架。TensorFlow框架儘管意義非凡,引起極大關注和神經網絡學習風潮,但對一般開發者用戶太不友好。軟體開發者畢竟不是科學家,很多時候簡單易學易用是程式設計師選擇的第一要素。
  • PYTORCH與TENSORFLOW:哪種框架最適合您的深度學習項目?
    訓練後的模型可以用於不同的應用程式,例如對象檢測,圖像語義分割等。儘管可以在任何這些框架上實現神經網絡的體系結構,但結果不一定是一樣的。訓練過程中有很多參數取決於框架。例如,如果您要在PyTorch上訓練數據集,則可以在GPU在CUDA(C ++後端)上運行時使用GPU來加速訓練過程。
  • Tensorflow和Pytorch深度學習框架安裝教程
    目前主流深度學習框架有Tensorflow和pytorch,由於一些原因我只在windows10下安裝了以上兩個深度學習框架。
  • 一行代碼即可調用18款主流模型!PyTorch Hub輕鬆解決論文可復現性
    ,加載ResNet、BERT、GPT、VGG、PGAN還是MobileNet等經典模型只需一行代碼。圖靈獎得主Yann LeCun發推表示,只需要一行代碼就可以調用所有倉庫裡的模型,通過一個pull請求來發布你自己的模型。同時,PyTorch Hub整合了Google Colab,併集成了論文代碼結合網站Papers With Code,可以直接找到論文的代碼。PyTorch Hub怎麼用?
  • 飛槳上線萬能轉換小工具,教你玩轉TensorFlow、Caffe等模型遷移
    在TensorFlow 2.0以前,還是靜態圖的設計思想,整個設計理念是計算流圖,在編寫程序時,首先構築整個系統的graph,代碼並不會直接生效,這一點和python的其他數值計算庫(如Numpy等)不同,graph為靜態的,在實際的運行時,啟動一個session,程序才會真正的運行。這樣做的好處就是:避免反覆地切換底層程序實際運行的上下文,tensorflow幫你優化整個系統的代碼。
  • 深度學習100+經典模型TensorFlow與Pytorch代碼實現大集合
    【導讀】深度學習在過去十年獲得了極大進展,出現很多新的模型,並且伴隨TensorFlow和Pytorch框架的出現,有很多實現,但對於初學者和很多從業人員
  • 一句代碼發布你的TensorFlow模型,簡明TensorFlow Serving上手教程
    一句代碼保存TensorFlow模型# coding=utf-8import tensorflow as tf# 模型版本號model_version = 1# 定義模型x = tf.placeholder(tf.float32, shape=[None, 4], name="x")
  • 掌握深度學習,為什麼要用 PyTorch、TensorFlow 框架?
    畢竟,許多數據集可以用解析方法或簡單的統計過程進行建模。另一方面,在某些情況下,深度學習或深度遷移學習可以幫助你訓練更準確的模型。在這些情況下,你可以考慮使用PyTorch和TensorFlow,特別是如果你所需的訓練模型與其中一個框架模型庫中的模型類似。PyTorchPyTorch建立在舊版的Torch和Caffe2框架之上。
  • 對比 | TensorFlow VS PyTorch下的深度學習框架之爭
    source:https://thegradient.pub/state-of-ml-frameworks-2019-pytorch-dominates-research-tensorflow-dominates-industry/對於廣大深度學習行業從業者而言,熟練掌握一種或多種深度學習框架,是日常煉丹的必備技能之一。
  • 上線倆月,TensorFlow 2.0被吐槽太難用,網友:看看人家PyTorch
    我有個想法,我想要在訓練過程中逐漸改變損失函數的『形狀』;2. 我搜索『tensorflow 在訓練中改變損失函數』;3. 最高搜索結果是一個 Medium 的文章,我們去看看吧;4. 這個 Medium 文章介紹的是均方誤差(MSE)損失函數,以及你怎樣在 TensorFlow 中用它訓練一個深度神經網絡;5. 我只好用腦袋砸鍵盤了。
  • 寫給純小白的深度學習環境搭建寶典:pytorch+tensorflow
    每天給小編五分鐘,小編用自己的代碼,讓你輕鬆學習人工智慧。本文將手把手帶你快速搭建你自己的深度學習環境,然後實現自己的第一個深度學習程序。野蠻智能,小白也能看懂的人工智慧。Anaconda+pytorch環境準備如果你的電腦帶有GPU,可以先安裝Nvidia驅動 + cuda + cudnn,然後再搭建環境,這樣可以達到更高的運行速度。如果不想使用GPU,學習階段也可以使用cpu版本,對於簡單的程序用CPU和GPU其實沒差別。
  • TensorFlow發布JavaScript開發者的機器學習框架TensorFlow.js
    在今天的幾項重大宣布中,比較有趣的是面向 JavaScript 開發者的全新機器學習框架 TensorFlow.js。在下文中,機器之心對 TensorFlow.js 做了細緻介紹:在大會的 Keynote 中,TensorFlow 團隊表示基於網頁的 JavaScript 庫 TensorFlow.js 現在已經能訓練並部署機器學習模型。
  • PyTorch 能追上 TensorFlow 嗎?
    現在,可以在Google Cloud的Tensor處理單元(TPU)上能更輕鬆地運行PyTorch,這是訓練複雜的深度學習模型最快的方法。此外,Chainer框架的維護者Preferred Networks最近將他們的團隊帶到了PyTorch。最後,如果您使用C++或Java,PyTorch會為您提供一個C++或Java版本。
  • Transformers2.0讓你三行代碼調用語言模型,兼容TF2.0和PyTorch
    更新後的 Transformers 2.0 汲取了 PyTorch 的易用性和 Tensorflow 的工業級生態系統。藉助於更新後的 Transformers 庫,科學家和實踐者可以更方便地在開發同一語言模型的訓練、評估和製作階段選擇不同的框架。那麼更新後的 Transformers 2.0 具有哪些顯著的特徵呢?
  • 如何使用 TensorFlow mobile 將 PyTorch 和 Keras 模型部署到行動裝置
    用 TensorFlow mobile 部署模型到安卓設備分為三個步驟:在這篇文章中,我將介紹整個過程,最後完成一個植入圖像識別功能的安卓應用。  安裝本教程會用到 PyTorch 和 Keras 兩個框架-遵循下列指導安裝你想使用的機器學習框架。安裝哪個由你選擇。
  • TensorFlow與PyTorch — 線性回歸
    x= [-1.0, 0.0, 1.0, 2.0, 3.0, 4.0]y= [-3.0, -1.0, 1.0, 3.0, 5.0, 7.0]y = 2*x -1在使用兩個框架訓練線性回歸模型時,將輸入x = 10的新值,並查看該模型對y的預測。
  • TensorFlow、PyTorch、Keras:NLP框架哪家強
    本文著重分析比較了這三個框架用於自然語言處理(Natural Language Processing,NLP)時的不同之處。1. 可用的RNN類型當試圖用深度學習方法來解決NLP問題時,循環神經網絡(Recurrent Neural Networks,RNNs)是開發者最常用的專業架構。