TensorFlow和PyTorch相繼發布最新版,有何變化
GIF/1.7M
原文來源:GitHub
「機器人圈」編譯:嗯~阿童木呀、多啦A亮
Tensorflow
主要特徵和改進
?在Tensorflow庫中添加封裝評估量。所添加的評估量列表如下:
1.深度神經網路分類器(DNN Classifier)
2.深度神經網路回歸量(DNN Regressor)
3.線性分類器(Linear Classifier)
4.線性回歸量(Linea rRegressor)
5.深度神經網路線性組合分類器(DNN Linear Combined Classifier)
6.深度神經網路線性組合回歸量(DNN Linear Combined Regressor)
?我們所有預構建的二進位文件都是用cuDNN 6構建的。
?import tensorflow現在運行要快得多。
?將文件緩存添加到GCS文件系統中,其中文件內容具有可配置的最大失效期(configurable max staleness)。這允許跨關閉/開放邊界緩存文件內容。
?將軸參數(axis parameter)添加到tf.gather中。
?向tf.pad中添加一個constant_values關鍵字參數。
?添加Dataset.interleave轉換。
?添加ConcatenateDataset以連接兩個數據集。
?在TensorFlow中為Poets訓練腳本添加Mobilenet 的支持。
?將塊緩存添加到具有可配置塊大小和計數的GCS文件系統中。
?添加SinhArcSinh Bijector。
?添加Dataset.list_files API。
?為雲TPU引進新的操作和Python綁定。
?添加與tensorflow-android相對稱的TensorFlow-iOS CocoaPod。
?引入集群解析器(Cluster Resolver)的基本實現。
?統一TensorShape和PartialTensorShape的內存表示。因此,張量現在最多有254個維度,而不是255個。
?更改對LIBXSMM的引用版本,使用1.8.1版本。
?TensorFlow調試器(tfdbg):
1.使用-s標誌顯示數字張量值的概要,用命令print_tensor或pt。
2.使用curses UI中的print_feed或pf命令和可點擊鏈接顯示Feed值。
3.op級別和Python源代碼行級別的運行分析器(Runtime profiler)使用run -p命令。
?統計分布庫tf.distributions的初始版本。
?將單調注意包裝器(Monotonic Attention wrappers)添加到tf.contrib.seq2seq。
API的突破性更改
?當tf.RewriterConfig在1.2版本的候選版本中可用(它從來沒有在實際版本中應用)後將其從Python API中刪除,圖重寫(Graph rewriting)仍然可用,只是不像tf.RewriterConfig那樣。而是添加顯式導入。
contrib API的更改
?在contrib中添加時間序列模型。有關詳細信息,請參閱contrib / timeseries / README.md。
?在tensorflow / contrib / lite / schema.fbs中添加FULLY_CONNECTED操作。
錯誤修正以及其他更改
?在python中使用int64 Tensor index進行切片時,修復strides和begin 類型失配問題。
?改進卷積padding文件。
?添加標籤常量,gpu,以顯示基於GPU支持的圖形。
?saved_model.utils現在顯然是支持SparseTensors的。
?非最大抑制(non-max suppression)更為有效的實現。
?除了對在線L2的支持之外,還增加了對從收縮型L2到FtrlOptimizer的支持。
?固定矩計算中的負方差。
?拓展UniqueOp基準測試,以涵蓋更多的collision案例。
?提高Mac上GCS文件系統的穩定性。
?在HloCostAnalysis中添加時間評估。
?修復Estimator中的錯誤,即構造函數中的參數不是對用戶提供參數的深度複製。這個錯誤無意中使得用戶在創建Estimator之後突變參數,從而導致潛在的未定義的行為。
?在saver.restore中添加了無檢查保存路徑。
?在device_mgr中以舊名稱註冊設備,以便輕鬆轉換到集群規範傳播(cluster spec-propagated)的配置。
?將向量指數添加到分布中。
?添加一個具有bitwise_and,bitwise_or,bitwise_xor和invert函數的按位模塊(bitwise module)。
?添加固定網格的ODE集成常式。
?允許將邊界傳遞到scipy最優化介面。
?使用「預測」方法導出的模型簽名將不再使其輸入和輸出密鑰被靜默地忽略,且被重寫為「輸入」和「輸出」。如果一個模型在1.2版本之前以不同的名稱導出,並且現在使用tensorflow / serving,它將接受使用"inputs"和"outputs"的請求。從1.2版本開始,這樣的模型將接受導出時指定的密鑰。因此,使用「輸入」和「輸出」的推理請求可能會開始有所失敗。為了解決這個問題,請更新任何推理客戶端,以發送具有訓練器代碼所使用的實際輸入和輸出密鑰的請求,或者相反地,更新訓練器代碼以分別命名輸入和輸出張量為"inputs"和 "outputs"。使用「分類」和「回歸」方法的簽名不會受此更改的影響;它們將繼續像以前一樣規範其輸入和輸出鍵。
?將內存中的緩存添加到Dataset API中。
?將數據集迭代器中的默認end_of_sequence變數設置為false。
?更新iOS示例以使用CocoaPods,並移動到tensorflow / examples / ios中。
?在tf.summary操作中添加一個family =attribute,以允許控制Tensorboard中用於組織摘要的選項卡名稱。
?當配置GPU時,如果在configure腳本中存在請求,則可根據請求自動構建GPU,而不需要--config = cuda。
?修復CPU / GPU多項式中小概率的不正確採樣。
?在session上添加一個list_devices()API以列出集群中的設備。此外,此更改增加了設備列表中的主要API以支持指定session。
?允許使用過參數化的可分離卷積。
?TensorForest多重回歸錯誤修復。
?框架現在支持armv7,cocoapods.org現在可顯示正確的頁面。
?為CocoaPods創建iOS框架的腳本。
?現在,TensorFlow的Android版本已經被推到了jcenter,以便更方便地集成到應用中。有關詳細信息,請參閱
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/android/README.md。
?TensorFlow調試器(tfdbg):
1.修復了一個阻止tfdbg使用多GPU設置的錯誤。
2.修復了一個阻止tfdbg使用tf.Session.make_callable的錯誤。
資源下載:
源代碼(zip)https://github.com/tensorflow/tensorflow/archive/v1.3.0-rc2.zip。
源代碼(tar.gz)https://github.com/tensorflow/tensorflow/archive/v1.3.0-rc2.tar.gz。
Pytorch0.2.0
這裡是PyTorch的下一個主要版本,恰恰趕上了國際機器學習大會(ICML)。今天開始可以從我們的網站http://pytorch.org下載安裝。
此版本的軟體包文檔可從http://pytorch.org/docs/0.2.0/獲取
我們引入了期待已久的功能,如廣播、高級索引、高階梯度梯度,最後是分散式PyTorch。
由於引入了廣播,某些可廣播情況的代碼行為與0.1.12中的行為不同。這可能會導致你現有代碼中出現錯誤。我們在「重要破損和解決方法」部分中提供了輕鬆識別此模糊代碼的方法。
目錄:
?張量廣播(numpy樣式)
?張量和變數的高級索引
?高階梯度
?分散式PyTorch(多節點訓練等)
?神經網路層和特徵:SpatialTransformers、WeightNorm、EmbeddingBag等
?torch 和 autograd的新應用:矩陣相乘、逆矩陣等
?更容易調試,更好的錯誤信息
?Bug修復
?重要的破損和解決方法
張量廣播(numpy樣式)
簡而言之,如果PyTorch操作支持廣播,則其張量參數可以自動擴展為相同大小(不複製數據)。
PyTorch廣播語義密切跟隨numpy式廣播。如果你熟悉數字廣播,可以按照之前流程執行。
一般語義學
如果以下規則成立,則兩個張量是「可廣播的」:
?每個張量具有至少一個維度。
?當從尺寸大小開始迭代時,從尾部維度開始,尺寸大小必須相等,其中一個為1,或其中一個不存在。
例如:
如果兩個張量x、y是「可廣播」的,則所得到的張量大小計算如下:
?如果x和y的維數不相等,則將尺寸縮小到尺寸較小的張量的前端,以使其長度相等。
?然後,對於每個維度大小,生成的維度大小是沿該維度的x和y的大小的最大值。
例如:
# can line up trailing dimensions to make reading easier
>>> x=torch.FloatTensor(5,1,4,1)
>>> y=torch.FloatTensor( 3,1,1)
>>> (x+y).size()
torch.Size([5, 3, 4, 1])
# error case
>>> x=torch.FloatTensor(5,2,4,1)
>>> y=torch.FloatTensor( 3,1,1)
>>> (x+y).size()
RuntimeError: The size of tensor a (2) must match the size of tensor b (3) at non-singleton dimension 1
更多細節可以在PyTorch文檔網站上找到。此外,每個torch函數列出了其文檔中的廣播語義。
張量和變數的高級索引
PyTorch現在支持NumPy樣式的高級索引的子集。這允許用戶使用相同的[]-樣式操作在Tensor的每個維度上選擇任意索引,包括不相鄰的索引和重複的索引。這使得索引策略更靈活,而不需要調用PyTorch的索引[Select, Add, ...]函數。
我們來看一些例子:
x = torch.Tensor(5, 5, 5)
純整數組索引—在每個維度上指定任意索引
x[[1, 2], [3, 2], [1, 0]]
--> yields a 2-element Tensor (x[1][3][1], x[2][2][0])
也支持廣播、副本
x[[2, 3, 2], [0], [1]]
--> yields a 3-element Tensor (x[2][0][1], x[3][0][1], x[2][0][1])
允許任意索引器形狀
x[[[1, 0], [0, 1]], [0], [1]].shape
--> yields a 2x2 Tensor [[x[1][0][1], x[0][0][1]], [x[0][0][1], x[1][0][1]]]
可以使用冒號、省略號
x[[0, 3], :, :] x[[0, 3], ...]
--> both yield a 2x5x5 Tensor [x[0], x[3]]
也可以使用張量來索引!
y = torch.LongTensor([0, 2, 4]) x[y, :, :]
--> yields a 3x5x5 Tensor [x[0], x[2], x[4]]
如果選擇小於ndim,請注意使用逗號
x[[1, 3], ]
--> yields a 2x5x5 Tensor [x[1], x[3]]
高階梯度
現在你可以評估PyTorch中的高階微分。例如,你可以計算Hessian-Vector,懲罰你的模型的梯度梯度的範數,實施unrolled GAN和改良WGAN等。
在0.2版本中,我們已經能夠為torch.XXX函數和最流行的nn層計算更高階的梯度。其餘的將出現在下一個版本中。
這是一個簡短的例子,懲罰了Resnet-18模型的權重梯度的範數,使權重的數量變化緩慢。
我們在這裡看到兩個新概念:
?你可以對梯度進行操作,並向後調用()。
支持更高階梯度的nn層的列表有:
?AvgPool*d, BatchNorm*d, Conv*d, MaxPool1d,2d, Linear, Bilinear。
?pad, ConstantPad2d, ZeroPad2d, LPPool2d, PixelShuffle。
?ReLU6, LeakyReLU, PReLU, Tanh, Tanhshrink, Threshold, Sigmoid, HardTanh, ELU,Softsign, SeLU。
?L1Loss, NLLLoss, PoissonNLLLoss, LogSoftmax, Softmax2d。
其餘的將在下一個版本中啟用。
為了實現更高階的梯度,我們引入了一種新的autograd.Function寫入格式。(寫入函數的當前/舊樣式完全向後兼容)。你可以點擊此處鏈接閱讀更多關於新樣式的函數。
大多數人不寫自己的autograd.Function,它們是低級基元使得autograd引擎完成新操作,你可以指定正向和反向調用。
分散式PyTorch
我們介紹torch.distributed包,允許你在多台機器之間交換張量。使用此軟體包,你可以通過多台機器和更大的小批量擴展網路訓練。例如,你將能夠實現《Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour》這篇論文。
distributed軟體包遵循MPI風格的編程模型。這意味著你可以得到很多函數,如send,recv,all_reduce,它將在節點(機器)之間交換張量。
對於每個機器,首先識別彼此並分配唯一的數字(等級),我們提供簡單的初始化方法:
?共享文件系統(要求所有進程可以訪問單個文件系統)
?IP組播(要求所有進程都在同一個網路中)
?環境變數(需要你手動分配等級並知道所有進程可訪問節點的地址)
我們的包文檔中包含有關初始化和可用後端的更多詳細信息,但以下是使用多播地址進行初始化的示例:
mport torch.distributed as dist dist.init_process_group(backend="tcp",
init_method="tcp://[ff15:1e18:5d4c:4cf0:d02d:b659:53ba:b0a7]:23456",
world_size=4)
print("Hello from process {} (out of {})!".format( dist.get_rank(), dist.get_world_size()))
這將在第3台機器上列印Hello from process 2 (out of 4)。
world大小是參與工作的過程的數量。每個將被分配一個等級,它是0和world_size-1之間的數字,在此作業中是唯一的。它將用作進程標識符,並且將被代替地址使用,例如,指定張量應被發送到哪個進程。
這是一個代碼段,顯示如何執行簡單的點對點通信:
非同步p2p函數(isend,irecv)也可用。
然而,一些通信模式出現頻繁,導致已經開發出更有效的集體調用。他們通常參與整個過程組,並且比使用send / recv的單純演算法要快得多。一個例子是all_reduce:
分散式軟體包是相當低級別的,因此它允許實現更先進的演算法,並將代碼定製到特定的目的,但數據並行訓練是我們為此創建高級輔助工具的常見方法。
因此,我們引入了DistributedDataParallel,這意味著幾乎可以替代nn.DataParallel。
以下是一個代碼段,展示了將其添加到現有訓練代碼中所需的更改:
你可以在這裡看到更完整的Imagenet訓練示例
新的nn層:SpatialTransformers,WeightNorm,EmbeddingBag等
新功能
?引入forward_pre_hook來在調用forward函數之前執行用戶指定的閉包。
?方便訪問非葉梯度(non-leaf gradients):
目前,要訪問並檢查中間值的梯度,我們必須使用鉤(hooks)。這不方便進行簡單的檢查,因此,我們引入retain_grad。最好通過一個例子來解釋:
?DataParallel現在支持dicts作為輸入
新圖層
?空間變換神經網路通過F.grid_sample和F.affine_grid。
?nn.SeLU和nn.AlphaDropout被引入,論文:《自標準化神經網路》。
?nn.GLU(門控線性單元)被引入,論文:《卷積序列到序列學習》。
?現在可以使用ignore_index參數計算cross_entropy_loss和nll_loss來忽略特定的目標索引。這是實現掩碼的廉價實用方式,你可以在其中使用在計算損失時忽略的掩碼索引。
?F.normalize 實現了按維度的重歸一化。
?F.upsample和nn.Upsample將多個Upsampling層合併成一個函數。它實現了2d和3d雙線性/三線性/最近的上採樣。
?nn.EmbeddingBag:當構建詞袋模型時,執行一個Embedding 跟Sum或Mean是很常見的。對於可變長度序列,計算降維包涉及掩碼。我們提供了一個單一的nn.EmbeddingBag,它能高效和快速地計算降維包,特別是對於可變長度序列。
?通過bce_with_logits數值穩定的二進位交叉熵損失。
?通過PoissonNLLLoss進行目標泊松分布的負對數似然損失。
?cosine_similarity:返回x1和x2之間的餘弦相似度,沿著dim計算。
訓練效用
提供各種策略,可以根據適當情況使用,更多可以在文檔包中閱讀:
?ReduceLROnPlateau,LambdaLR,StepLR,MultiStepLR,ExponentialLR
ConcatDataset是一個方便的數據集元類,可以合併和連接兩個單獨的數據集。
torch 和 autograd的新應用
?所有reduce函數如sum和mean,現在默認壓縮縮小的維度。例如,torch.sum(torch.randn(10,20))返回1D Tensor。
?x.shape,類似於numpy。 一個方便的屬性,相當於x.size()。
?torch.matmul,類似於np.matmul。
?按位和,或,xor,lshift,rshift。
?autograd支持反向,gesv,cumprod,atan2。
?無偏差的var和std現在可以通過關鍵字參數選項。
?torch.scatter_add - torch.scatter,除了遇到重複索引時,這些值被求和。
?當沒有給出參數時,torch.median的行為類似於torch.sum,即它減小所有尺寸,並返回扁平化Tensor的單個中值。
?masked_copy_已重命名為masked_scatter_(在masked_copy_上已棄用)。
?torch.manual_seed現在也seed所有的CUDA設備。
?你現在可以通過關鍵字參數torch.rand(1000,generator = gen)指定隨機數生成器對象。
錯誤修復和小改進
現在,當將變數轉換為bool時,我們會發出錯誤。例如:
b = Variable(torch.zeros(1)) if b[0]: # errors now
?在CUDA中解決qr分解中的正確性錯誤。
?支持IBM PowerPC64平台。
?檢查編譯時的CuDNN版本是否在運行時是相同的版本。
?改進CUDA分叉子進程中的錯誤消息。
?在CPU上更快的轉置拷貝。
?改進InstanceNorm中的錯誤消息。
?為各種常式添加更多的參數檢查,特別是BatchNorm和Convolution常式。
?圍繞CPU後端的形狀報告更好的錯誤消息。
?支持每台機器超過8個GPU(解決CUDA p2p限制)。
?訪問不存在的屬性時,改進錯誤消息。
?變數的T()與Tensor一致。
?當退出p = 1時,防止除以零。
?修復在非當前設備上共享CUDA張量。
?當BNε
?對於MKL和OMP使用不同數量的線程時,修複線程丟失。
?改善使用CuDNN RNN時的內存使用。
?用負的padding將ZeroPad2d向後修復。
?添加虛擬tensor.data屬性,為用戶提供可解釋的錯誤消息。
?修復Python3的原位劃分。
?在0-dim數組上調用from_numpy時提高誤差。
?空的張量在多處理器間共享時不會出錯。
?修復擴展張量的baddbmm。
?讓parallel_apply接受任意輸入。
?張量和變數中的關鍵字參數現在是一致的。
?當Magma不可用時修復torch.inverse。
?為ByteTensor添加邏輯非運算符。
?在分散/收集內核中添加設備判斷提示。
重要的破損和解決方法
如你所見,我們引入了兩個不能向後兼容的重要更改:
?Numpy樣式廣播。
?還原函數如sum(1)現在默認為keepdim = False。
我們提供不同級別的Python警告,你可以啟用以警告你,如果你使用不贊成的行為,或者你的代碼的行為已更改。
摘要
這是一個代碼片段,你可以添加到腳本的頂部。
添加此代碼將生成突出顯示不兼容代碼的警告。
修復代碼不再生成警告。
一旦所有警告消失,你可以刪除代碼段。
詳情
現在,讓我們看看這三個不相容的變化與例子。
使用(現已棄用)1維視圖點分函數
PyTorch的先前版本允許某些點函數在不同形狀的張量上執行,只要每個張量中的元素數量相等即可。 然後通過將每個張量視為一維來執行點操作。 PyTorch現在支持廣播。 「一維」點行為被認為是不推薦的,並且在張量不可廣播但具有相同數量的元素的情況下會產生Python警告。
例如:
在以前沒有發生過的代碼中進行廣播
在兩張張量不相同的情況下,廣播的引入可能導致向後不兼容的變化,但是可以廣播並具有相同數量的元素。
例如:
>>> torch.add(torch.ones(4,1), torch.randn(4))
以前會產生一個尺寸為:torch.Size([4,1])的張量,但現在生產的尺寸為:torch.Size([4,4])。
例如:
>>> torch.add(torch.ones(4,1), torch.ones(4)) __main__:1: UserWarning: self and other do not have the same shape, but are broadcastable, and have the same number of elements.
請注意,此設置可以觸發廣播有效使用的警告(包括庫代碼),因此你可能希望在遷移代碼後關閉此警告。
還原函數的KeepDim = False。
>>> torch.sum(torch.ones(2,3), 1) __main__:1: UserWarning: backwards compatibility: call to "sum" uses default value for keepdim which has changed default to False. Consider passing as kwarg.
3
3
[torch.FloatTensor of size 2]
還要注意,使用keepdim = False可以使你現有的代碼與廣播「正常工作」。 例如:
資源下載:
源代碼(zip):https://github.com/pytorch/pytorch/archive/v0.2.0.zip。
源代碼(tar.gz):https://github.com/pytorch/pytorch/archive/v0.2.0.tar.gz。
※如何用CoreML和Swift在蘋果上開發「實時對象識別器」
※你離識別這些AI謊言有多遠?科普綜藝來補位
※LR-GAN如何生成圖像?這裡有篇Pytorch教程
※實時風格遷移原來這麼酷!用PyTorch分分鐘搞定
※Salesforce AI最新研究,如何情境化詞向量進行翻譯
TAG:機器人圈 |
※iPhone 6s plus的三點變化,贏了iPhone X
※Angular 6 LazyLoading 變化
※新鮮事:vivo Xplay 7曝光/iPhone SE二代外觀無變化
※《Science Advances》:科學家發現北極氣候變化迅速的證據
※iPhone 9和iPhone Xs預期變化:LCD屏、單相機、更便宜
※iPhone X Plus、iPhone 9模型機曝光,一探機身尺寸變化!
※灰色調的層次變化 Adidas Harden Vol.2 新款一覽
※蘋果新一代 MacBook Pro新變化/外媒評蘋果 Blackmagic eGPU/蘋果無人駕駛車輛數量增加
※小屏黨的假想圖?iPhone SE 2對比iPhone 5s,變化不大
※Android系統將發生重磅變化!谷歌最新自主研發的新一代操作系統 Fuchsia OS 曝光:流暢度完勝蘋果iOS
※Robinhood的加密平台可能會發生重大變化,市場專家表示Coinbase應該擔心
※外媒:iPhoneXPlus三大變化:機身與8Plus一樣大
※初代iPhone和iPhoneX對比 十年間蘋果有哪些變化
※jQuery之監聽input、textarea輸入框值變化
※Science Robotics發布韓國「毛毛蟲」機器人,僅靠環境濕度變化就能前進!
※原創新人#奶泡玩法多變化—Nespresso 奈斯派索 Creatista Plus 咖啡機 黑色
※為 Apple Watch 刷上 watchOS 5 後,我發現了這些變化
※iPhoneXPlus概念圖:除了丑劉海變寬還有啥變化
※iPhone 11圖紙曝光 外觀和iPhone X幾乎沒有變化
※InishTurkBeg私人島嶼品牌設計:醉人和不斷變化的