現(xiàn)在知道還不算晚,輸入示例自動生成代碼,谷歌開源這項神器要火
操作張量并非易事,因為它需要很多先決條件,例如跟蹤多個維度,Dtype兼容性,數(shù)學正確性和張量形狀等。當然最大的挑戰(zhàn)還是從數(shù)百種可用選項中確定正確的TensorFlow操作。
假如不需要你進行對張量操縱進行編碼,你只需要通過一個說明性的例子來演示,有個工具就能生成相應的代碼,你會選擇這個工具么?如果會的話,谷歌的TensorFlow Coder(TF-Coder)可以幫你實現(xiàn)這一點。
TF-Coder是一個程序合成工具,可以幫助你編寫TensorFlow代碼,首先,這個工具需要輸入所需張量變換的輸入-輸出示例。然后,它會運行一個組合搜索來查找執(zhí)行轉(zhuǎn)換的TensorFlow表達式。TF-Coder的輸出是真實的TensorFlow代碼,你可以直接將它用在你的項目中。
接著,我們再來詳細介紹一下TF-Coder是如何幫助你編寫TensorFlow代碼。
在TensorFlow中的編程示例
假如你想將包含 M 個元素的向量(下例中指‘rows’)和包含 N 個元素的向量“想加”,生成一個包含所有成對和的 M x N 矩陣。你可以提供一個輸入輸出示例(如M=3和N=4),而不需要深入研究TensorFlow文檔來找出如何做到這一點。
輸入張量:
- inputs = {
- 'rows': [10, 20, 30],
- 'cols': [1, 2, 3, 4],
- }
所提供的輸入張量對應的期望輸出張量:
- output = [[11, 12, 13, 14],
- [21, 22, 23, 24],
- [31, 32, 33, 34]]
給定這些信息(默認情況下已經(jīng)輸入到TF-Coder Colab中),TF-Coder工具會在零點幾秒內(nèi)自動找到合適的TensorFlow代碼:
- tf.add(cols, tf.expand_dims(rows, 1))
上面的問題非常簡單,只是通過示例來說明編程的思想。TF-Coder對于更難的問題也很有用。
TF-Coder幫助你找到要使用的正確函數(shù)
假設我們正在處理一個數(shù)學問題,比如商品的價格,數(shù)據(jù)集中范圍很廣,從$10以下到$1000以上。如果這些價格被直接用作特征,那么你的模型可能會對訓練數(shù)據(jù)中的特定價格過度擬合。
假如要處理這些問題,你可能需要使用bucketing將數(shù)字價格轉(zhuǎn)換成類別特征。使用bucket邊界 [10, 50, 100, 1000] 意味著低于10美元的價格應歸入bucket 0,10美元至50美元的價格應歸入bucket 1,依此類推。
選擇bucket邊界之后,如何使用TensorFlow將實際價格映射到bucket索引?諸如給定以下bucket邊界和物品價格:
- # Input tensors
- boundaries = [10, 50, 100, 1000]
- prices = [15, 3, 50, 90, 100, 1001]
計算每個項的bucket編號:
- # Output tensor
- bucketed_prices = [1, 0, 2, 2, 3, 4]
盡管TensorFlow提供了各種bucketing操作,但要找出哪個特定的操作執(zhí)行這種確切的bucketing可能比較棘手。由于TF-Coder可以通過行為識別數(shù)百個張量操作,你可以通過提供一個輸入-輸出示例來查找正確的操作:
- # Input-output example
- inputs = {
- 'boundaries': [10, 50, 100, 1000],
- 'prices': [15, 3, 50, 90, 100, 1001],
- }
- output = [1, 0, 2, 2, 3, 4]
很快,TF-Coder就會輸出如下解決方案:
- tf.searchsorted(boundaries, prices, side='right')
TF-Coder通過聰明的方式結(jié)合函數(shù)
現(xiàn)在我們來考慮另一個問題:計算一個0-1的張量,它能識別輸入張量每一行中的最大元素。
- # Input tensor
- scores = [[0.7, 0.2, 0.1],
- [0.4, 0.5, 0.1],
- [0.4, 0.4, 0.2],
- [0.3, 0.4, 0.3],
- [0.0, 0.0, 1.0]]
- # Output tensor
- top_scores = [[1, 0, 0],
- [0, 1, 0],
- [1, 0, 0],
- [0, 1, 0],
- [0, 0, 1]]
注意,如果同一最大元素在一行中出現(xiàn)多次,比如在第三行scores中,那么應該只標記第一個最大元素,以便top_scores的每行只有一個結(jié)果。
和上個問題不同的是,這里不存在可執(zhí)行該計算的 TensorFlow 函數(shù)。在文檔中搜索「max」,你可能找到 tf.reduce_max、tf.argmax 和 tf.maximum,但也不清楚到底該用哪一個?tf.reduce_max 輸出 [0.7, 0.5, 0.4, 0.4, 1.0],tf.argmax 輸出 [0, 1, 0, 1, 2],tf.maximum 不合適,因為它只能容納兩個參數(shù)。這些函數(shù)似乎都與該示例的期望輸出關(guān)聯(lián)不大。
對于此類問題,TF-Coder也可以快速解決。你可以把這個問題寫成輸入輸出例子的形式
- # Input-output example
- inputs = {
- 'scores': [[0.7, 0.2, 0.1],
- [0.4, 0.5, 0.1],
- [0.4, 0.4, 0.2],
- [0.3, 0.4, 0.3],
- [0.0, 0.0, 1.0]],
- }
- output = [[1, 0, 0],
- [0, 1, 0],
- [1, 0, 0],
- [0, 1, 0],
- [0, 0, 1]]
TF-Coder結(jié)合使用tf.one_hot和tf.argmax,得出一個解決方案:
- tf.cast(tf.one_hot(tf.argmax(scores, axis=1), 3), tf.int32)
通過對TensorFlow操作組合的詳細搜索,TF-Coder經(jīng)常會找到類似這樣的優(yōu)雅解決方案,這可能會簡化并加速TensorFlow程序的開發(fā)。
關(guān)于TF-Coder的用法還有很多,這里就不一一列舉了,相信你已經(jīng)見識到他的強大了,最后附上TF-Coder相關(guān)地址:
Github地址:https://github.com/google-research/tensorflow-coder
Google Colab 試用地址:https://colab.research.google.com/github/google-research/tensorflow-coder/blob/master/TF-Coder_Colab.ipynb