1. 程式人生 > >利用 TensorFlow 實現排序和搜尋演算法

利用 TensorFlow 實現排序和搜尋演算法

640.gif?wxfrom=5&wx_lazy=1

本文來自作者chen_h 在 GitChat 上分享「利用 TensorFlow 實現排序和搜尋演算法」,閱讀原文」檢視交流實錄

文末高能

編輯 | 嘉仔

當我們提到 TensorFlow 的時候,我們僅僅只會關注它是一個很好的神經網路和深度學習的庫。

但是,其實 TensorFlow 具有 tf.cond( https://www.tensorflow.org/api_docs/python/tf/cond ) 和 tf.while_loop( https://www.tensorflow.org/api_docs/python/tf/while_loop 函式,前者可以處理判斷語句,後者可以處理迴圈語句,所以它也具有一般程式語言相同的表示式。

簡單的說,我們可以用 C 語言或者 Python 語言實現的排序和搜尋演算法都可以在 TensorFlow 圖中實現。

在本文中,我們就是要介紹 TensorFlow 的另一面,它的一般程式語言表達方式。我們利用 TensorFlow 圖實現了一些簡單演算法,諸如 FizzBuzz 問題,線性搜尋,氣泡排序 等等。

1. API 解釋

1.1 類似判斷語句的 API:tf.cond()

cond(    pred,    true_fn=None,    false_fn=None,    strict=False,    name=None,    fn1=None,    fn2=None )

tf.cond(...) 是一個等效於 if 語句的節點。根據其中的引數 pred 返回的布林值來判斷返回什麼值,比如當引數 pred  true 值時,節點返回引數 true_fn 的值,當引數 pred  false 時,節點返回引數 false_fn 的值。但是,其中的引數 true_fn 和引數 false_fn 都是需要是 lambda 或者函式。比如:

z = tf.multiply(a, b) result = tf.cond(x < y, lambda: tf.add(x, z), lambda: tf.square(y))

當 x < y 是 true 時,節點就會去執行 tf.add 操作。當 x < y 是 false 時,節點就會去執行 tf.square 操作。

0?wx_fmt=jpeg

接下來,我們來看一個完整的例子,如下:

x = tf.constant(2) y = tf.constant(5) def f1():    return tf.multiply(x, 17) def f2():    return tf.add(y, 23) r = tf.cond(tf.less(x, y), f1, f2) with tf.Session() as sess:    print(sess.run(r))

請注意:API 中的某些引數被忽略了,因為它們將在以後的版本中被刪除。

  • tf.cond — TensorFlow API r1.3(https://www.tensorflow.org/api_docs/python/tf/cond)

1.2 類似判斷語句的 API: tf.while_loop()

while_loop(    cond, # Condition      body, # Process to be executed when cond is True    loop_vars, # Argument to body    shape_invariants=None,    parallel_iterations=10,    back_prop=True,    swap_memory=False,    name=None )

tf.while_loop(...) 是一個等效於 while 語句的節點。根據其中的引數 cond 的布林值來判斷是否將迴圈繼續,比如當引數 pred  true 值時,節點去執行 body 中的語句,當引數 pred  false 時,那麼退出這個函式。比如:

i = tf.constant(0) c = lambda i: tf.less(i, 10) b = lambda i: tf.add(i, 1) r = tf.while_loop(c, b, [i])

當 i < 10 時,cond 返回的值是 true,所以節點會去執行 body 中的語句。當 i == 10 時,cond 返回的值是 false,那麼節點就會退出。這種執行方式和一般語言中的 while 非常像。

0?wx_fmt=jpeg

我們也可以將迴圈式表達成如下:

while(cond(loop_vars)) {     loop_vars = body(loop_vars); }

接下來,我們來看一個完整的例子,如下:

import tensorflow as tf import numpy as np def body(x):    a = tf.random_uniform(shape=[2, 2], dtype=tf.int32, maxval=100)    b = tf.constant(np.array([[1, 2], [3, 4]]), dtype=tf.int32)    c = a + b    return tf.nn.relu(x + c) def condition(x):    return tf.reduce_sum(x) < 100 x = tf.Variable(tf.constant(0, shape=[2, 2])) with tf.Session():    tf.initialize_all_variables().run()    result = tf.while_loop(condition, body, [x])    print(result.eval())

  • tf.while_loop — TensorFlow API r1.3(https://www.tensorflow.org/api_docs/python/tf/while_loop)

2. 在 TensorFlow 中實現演算法

2.1 Fizz Buzz 問題

請依次列印從1至100的整數,在該數能被3整除的時候,列印”Fizz”,能被5整除的時候列印”Buzz”,如果既能被3又能被5整除的時候,列印”FizzBuzz”。

import tensorflow as tf class FizzBuzz():    def __init__(self, length=30):        self.length = length  # 程式需要執行的序列長度        self.array = tf.Variable([str(i) for i in range(1, length+1)], dtype=tf.string, trainable=False)  # 最後程式返回的結果        self.graph = tf.while_loop(self.cond, self.body, [1, self.array],)   # 對每一個值進行迴圈判斷    def run(self):        with tf.Session() as sess:            tf.global_variables_initializer().run()            return sess.run(self.graph)        def cond(self, i, _):        return (tf.less(i, self.length+1)) # 判斷是否是最後一個值    def body(self, i, _):        flow = tf.cond(            tf.equal(tf.mod(i, 15), 0),  # 如果值能被 15 整除,那麼就把該位置賦值為 FizzBuzz                lambda: tf.assign(self.array[i - 1], 'FizzBuzz'),                lambda: tf.cond(tf.equal(tf.mod(i, 3), 0), # 如果值能被 3 整除,那麼就把該位置賦值為 Fizz                        lambda: tf.assign(self.array[i - 1], 'Fizz'),                        lambda: tf.cond(tf.equal(tf.mod(i, 5), 0),   # 如果值能被 5 整除,那麼就把該位置賦值為 Buzz                                lambda: tf.assign(self.array[i - 1], 'Buzz'),                                lambda: self.array  # 最後返回的結果                )            )        )        return (tf.add(i, 1), flow) if __name__ == '__main__':    fizzbuzz = FizzBuzz(length=50)    ix, array = fizzbuzz.run()    print(array)

輸出結果:

['1' '2' 'Fizz' '4' 'Buzz' 'Fizz' '7' '8' 'Fizz' 'Buzz' '11' 'Fizz' '13' '14' 'FizzBuzz' '16' '17' 'Fizz' '19' 'Buzz' 'Fizz' '22' '23' 'Fizz' 'Buzz' '26' 'Fizz' '28' '29' 'FizzBuzz' '31' '32' 'Fizz' '34' 'Buzz' 'Fizz' '37' '38' 'Fizz' 'Buzz' '41' 'Fizz' '43' '44' 'FizzBuzz' '46' '47' 'Fizz' '49' 'Buzz']

2.2 線性搜尋

給定一個序列和一個目標值,從這個序列中找到這個目標值的位置。

import numpy as np import tensorflow as tf class LinearSearch():    def __init__(self, array, x):        self.x = tf.constant(x)        self.array = tf.constant(array)        self.length = len(array)        self.graph = tf.while_loop(self.cond, self.body, [0, self.x, False])    def run(self):        with tf.Session() as sess:            tf.global_variables_initializer().run()            return sess.run(self.graph)    def cond(self, i, _, is_found):        return tf.logical_and(tf.less(i, self.length), tf.logical_not(is_found))    def body(self, i, _, is_found):        return tf.cond(tf.equal(self.array[i], self.x),                    lambda: (i, self.array[i], True),                    lambda: (tf.add(i, 1), -1, False)) if __name__ == '__main__':    array, x = [1, 22, 33, 1, 7, 3, 8], 3    search = LinearSearch(array, x)    ix, xx, is_found = search.run()    print('Array :', array)    print('Number to search :', x)    if is_found:        print('{} is at index {}.'.format(xx, ix))    else:        print('Not found.')

輸出結果:

Array : [1, 22, 33, 1, 7, 3, 8] Number to search : 3 3 is at index 5.

2.3 氣泡排序

給定一個數組,利用氣泡排序進行排序,最後輸出排好序的陣列。氣泡排序演算法可以檢視這個文件(https://en.wikipedia.org/wiki/Bubble_sort)。

import numpy as np import tensorflow as tf class BubbleSort():    def __init__(self, array):        self.i = tf.constant(0)        self.j = tf.constant(len(array)-1)        self.array = tf.Variable(array, trainable=False)        self.length = len(array)        cond = lambda i, j, _: tf.less(i-1, self.length-1)        self.graph = tf.while_loop(cond, self.outer_loop, loop_vars=[self.i, self.j, self.array])    def run(self):        with tf.Session() as sess:            tf.global_variables_initializer().run()            return sess.run(self.graph)    def outer_loop(self, i, j, _):        cond = lambda i, j, _: tf.greater(j, i)        loop = tf.while_loop(cond, self.inner_loop, loop_vars=[i, self.length-1, self.array])        return tf.add(i, 1), loop[1], loop[2]    def inner_loop(self, i, j, _):        body = tf.cond(tf.greater(self.array[j-1], self.array[j]),                    lambda: tf.scatter_nd_update(self.array, [[j-1],[j]], [self.array[j],self.array[j-1]]),                    lambda: self.array)        return i, tf.subtract(j, 1), body if __name__ == '__main__':    x = np.array([1.,7.,3.,8.])    _, _, sorted_array = BubbleSort(x).run()    print(x)    print(sorted_array)

輸出結果:

[ 1.  7.  3.  8.] [ 1.  3.  7.  8.]

TensorFlow 還有更多的實現演算法,你可以檢視這個 Github(https://github.com/akimach/EsotericTensorFlow)。

近期熱文

GitChat 與 CSDN 聯合推出

《GitChat 達人課:AI 工程師職業指南》

640?wx_fmt=jpeg

「閱讀原文」看交流實錄,你想知道的都在這裡

相關推薦

利用 TensorFlow 實現排序搜尋演算法

本文來自作者chen_h 在 GitChat 上分享「利用 TensorFlow 實現排序和搜尋演算法」,「閱讀原文」檢視交流實錄 「文末高能」 編輯 | 嘉仔 當我們提到 TensorFlow 的時候,我們僅僅只會關注它是一個很好的神經網路和深度學習的庫。 但是,其實 TensorFlow

利用-TensorFlow-實現排序搜尋演算法

作者:chen_h 微訊號 & QQ:862251340 微信公眾號:coderpai TensorFlow 所構成的計算圖是圖靈完備的。 當我們提到 TensorFlow 的時候,我們僅僅只會關注它是一個很好的神經網路和深度學習的庫

為什麼我要放棄javaScript資料結構與演算法(第十章)—— 排序搜尋演算法

本章將會學習最常見的排序和搜尋演算法,如氣泡排序、選擇排序、插入排序、歸併排序、快速排序和堆排序,以及順序排序和二叉搜尋演算法。 第十章 排序和搜尋演算法 排序演算法 我們會從一個最慢的開始,接著是一些效能好一些的方法 先建立一個數組(列表)來表示待排序和搜尋的資料結構。 function Arra

C++ Leetcode初級演算法排序搜尋

1.合併兩個有序陣列 給定兩個有序整數陣列 nums1 和 nums2,將 nums2 合併到 nums1 中,使得 num1 成為一個有序陣列。 說明: 初始化 nums1 和 nums2 的元素數量分別為 m 和 n。 你可以假設 nums1 有足夠的空間(空間大小大於或等於

LeetCode——中級演算法——排序搜尋——前K個高頻元素(JavaScript)

給定一個非空的整數陣列,返回其中出現頻率前 k 高的元素。 示例 1: 輸入: nums = [1,1,1,2,2,3], k = 2 輸出: [1,2] 示例 2: 輸入: nums = [1], k = 1 輸出: [1] 說明: 你可以假設給定的 k 總是合

JavaScript實現常見排序搜尋演算法

前言 在本部分將主要學習常用的排序和搜尋演算法: 如:氣泡排序、選擇排序、插入排序、歸併排序、 快速排序和堆排序等以及:順序搜尋和二分搜尋演算法。 //1、在開始排序演算法之前,先建立一個數組(列表)來表示待排序和搜尋的資料結構。 function ArrayList(

LeetCode初級演算法--排序搜尋01:第一個錯誤的版本

LeetCode初級演算法--排序和搜尋01:第一個錯誤的版本 搜尋微信公眾號:'AI-ming3526'或者'計算機視覺這件小事' 獲取更多演算法、機器學習乾貨 csdn:https://blog.csdn.net/baidu_31657889/ csdn:https://blog.csdn.net/ab

利用Tensorflow實現神經網絡模型

flow one 什麽 hold test ase tensor dom def 首先看一下神經網絡模型,一個比較簡單的兩層神經。 代碼如下: # 定義參數 n_hidden_1 = 256 #第一層神經元 n_hidden_2 = 128 #第

利用Tensorflow實現手寫字符識別

status ade 模式 數學 malloc interact tutorials x模型 項目 模式識別領域應用機器學習的場景非常多,手寫識別就是其中一種,最簡單的數字識別是一個多類分類問題,我們借這個多類分類問題來介紹一下google最新開源的tensorflow框架

利用postman 實現GetPost測試

支持 而且 通信 type 瀏覽器 ont 服務器 金字塔 bsp 通過之前對金字塔結構的學習,大概了解到了金字塔模型想告訴我們的幾個道理:   1.越底層,越穩定。   金字塔主要觀點認為單元測試的穩定性高,需要多投入。   2.越底層,越高效。   程序的問題,最終還

第二十一節,使用TensorFlow實現LSTMGRU網絡

進行 初始 引入 turn lean tuple inf deep can 本節主要介紹在TensorFlow中實現LSTM以及GRU網絡。 關於LSTM的詳細內容推薦閱讀以下博客: LSTM模型與前向反向傳播算法 深度學習筆記(五):LSTM tensorflow筆記:

利用Java實現GETPOST請求

三個類 Java建立代理連線物件 Java傳送Post請求 Java傳送Get請求 程式碼 Java建立代理連線物件 /** * 1.返回代理物件 * @param proxyIp * @param

用java實現排序查詢

氣泡排序 假設一個數組中有n個元素; 從陣列的第一個元素開始,中是比較與後一個元素,如果前一個元素大於後一個元素,就交換位置,否則繼續比較後面的元素,直到選出最大的元素。這樣的排序類似於水中的冒泡,越大的泡上升的速度越快。這樣一共比較n次,第i趟比較n-i-1次。 實現: pac

樹莓派上利用Tensorflow實現小車的自動駕駛

先丟擲大家最關心的——程式碼地址: github傳送門:https://github.com/Timthony/self_drive 碼雲傳送門:https://gitee.com/tiantianhang/self_drive 基於樹莓派的人工智慧自動駕駛小車 # 整體流程 電機控

續(利用tensorflow實現簡單的卷積神經網路-對程式碼中相關函式介紹)——遷移學習小記(三)

  上篇文章對cnn進行了一些介紹,附了完整小例子程式碼,介紹了一部分函式概念,但是對我這樣的新手來說,程式碼中涉及的部分函式還是無法一下子全部理解。於是在本文中將對程式碼中使用的函式繼續進行一一介紹。 具體程式碼見上一篇(二) 一、 #定義輸入的placehoder,x是特徵

利用tensorflow實現簡單的卷積神經網路——遷移學習小記(二)

一、什麼是神經網路(CNN)     卷積神經網路(Convolutional Neural Network,簡稱CNN),是一種前饋神經網路,人工神經元可以影響周圍單元,可以進行大型影象處理。卷積神經網路包括卷積層和池化層。卷積神經網路是受到生物思考方式的啟發的MLPs(多

利用tensorflow實現簡單的卷積神經網路

一、什麼是神經網路(CNN)     卷積神經網路(Convolutional Neural Network,簡稱CNN),是一種前饋神經網路,人工神經元可以影響周圍單元,可以進行大型影象處理。卷積神經網路包括卷積層和池化層。卷積神經網路是受到生物思考方式的啟發的MLPs(

利用tensorflow實現前向傳播

import tensorflow as tfw1 = tf.Variable(tf.random_normal((2, 3), stddev=1, seed=1))w2 = tf.Variable(tf.random_normal((3, 1), stddev=1, seed=1))x = tf.const

利用Python實現基於協同過濾演算法的影片推薦

協同過濾演算法即對一大群人進行搜尋,找出其中品味與我們相近的一小群人,並將這一小群人的偏好進行組合來構造一個推薦列表。 本文利用Python3.5分別實現了基於使用者和基於物品的協同過濾演算法的影片推薦。具體過程如下:先建立了一個涉及人員、物品和評價值的字典,

倒排檔案索引結構搜尋演算法

為了減小索引檔案的大小使用了壓縮技術。首先,對詞典檔案中的關鍵詞進行了壓縮,關鍵詞壓縮為<字首長度,字尾>,例如:當前詞為“阿拉伯語”,上一個詞為“阿拉伯”,那麼“阿拉伯語”壓縮為<3,語>。其次大量用到的是對數字的壓縮,數字只儲存與上一個值的差值(這樣可以減小數字的長度,進而減少儲存