TensorFlow1.5 新年全新教程(系列)

title: TensorFlow1.5 新年全新教程(系列)date: 2018-02-18 14:53:01category: 默認分類

本文介紹 TensorFlow1.5 新年全新教程(系列)<!-- more -->

TensorFlow1.5 新年全新教程(系列)

This article was original written by Jin Tian, welcome re-post, first come with https://jinfagang.github.io . but please keep this copyright info, thanks, any question could be asked via wechat: jintianiloveu

很久沒有更博客了,眨眼都已經2018年了,遙想去年跨年就好像發生在前天一樣,預祝大家2019年豬年大吉。

閑話不多說。在家呆久了不學點東西感覺心虛,科技發展這麼快,不腳踏實地開疆拓土怎麼行呢?新年就要有新氣象嘛,作為一位人工智慧行業從業者,希望以一個過來的人的身份,帶領更多的人在這條道路上披荊斬棘,開拓新的領域。工欲善其事必先利其器,TensorFlow1.5都已經發布了,我們還有什麼理由不去學習一下最新的tf.data.Dataset API? 還有什麼理由不期待一下TensorFlow Lite的終極版本以及專屬於移動端的模型存儲框架FlatBuf…感覺科技又前進了一個世紀,不過沒有關係。凡事都得從當下做起。自從1.5版本發布 之後,tensorflow裡面的很多API都將凍住了,並且會越來越規範化,為的正式迎接2018年深度學習應用落地的爆發之年。

閑話就說到這裡了。我們首先從tensorflow的最新dataset API說起。

開始之前給大家安利一個工具:alfred, 專門為深度學習打造的工具,歡迎大家star, fork,enhance。我們接下來用它來隨時爬幾張豬啊狗啊的圖片。

tf.data.Dataset

這個以前是在contrib下面的一個介面,現在放到了data下面,可以說是非常正統的tensorflow數據導入介面了。以前都是用tfrecords,現在不管是從單張圖片,從文件夾路徑,還是從numpy array類型的數據,都非常方便了。

假設我們有一個圖片分類的簡單任務。我們的目錄是這樣的:

-data |-dog |-pig |-...

這個豬啊狗啊的圖片alfred可以幫你爬取:

sudo pip3 install alfred-pyalfred scrap image -q dogalfred scrap image -q pig

每個類別裝了許多同一類的圖片。那直接讀取到python的list,然後轉成tensor,通過tf.data.Dataset就可以讀入到tensorflow裡面。

import tensorflow as tfimport osNUMC_CLASSES = 2def load_image(): train_dir = data all_classes = [] all_images = [] all_labels = [] for i in os.listdir(train_dir): current_dir = os.path.join(train_dir, i) if os.path.isdir(current_dir): all_classes.append(i) for img in os.listdir(current_dir): if img.endswith(png) or img.endswith(jpg): all_images.append(os.path.join(current_dir, img)) all_labels.append(all_classes.index(i)) return all_images, all_labels, all_classesdef train(): all_images, all_labels, all_classes = load_image() print(all_classes) # convert all images list to tensor, using Dataset API to load train_data = tf.data.Dataset.from_tensor_slices((tf.constant(all_images), tf.constant(all_labels))) iterator = tf.data.Iterator.from_structure(train_data.output_types, train_data.output_shapes) next_elem = iterator.get_next() train_init_op = iterator.make_initializer(train_data) with tf.Session() as sess: sess.run(train_init_op) while True: try: print(sess.run(next_elem)) except tf.errors.OutOfRangeError: print(data iterator finish.) breakif __name__ == __main__: train()

我們可以看到輸出結果是:

[dog, pig](bdog_00.jpg, 0)(bdog_01.jpg, 0)(bpig_00.jpg, 1)(bpig_01.jpg, 1)(bpig_010.jpg, 1)(bpig_02.jpg, 1)(bpig_03.jpg, 1)(bpig_04.jpg, 1)(bpig_05.jpg, 1)(bpig_06.jpg, 1)(bpig_07.jpg, 1)(bpig_08.jpg, 1)(bpig_09.jpg, 1)data iterator finish.

圖片和標籤都已經獲得。用最新的Dataset API中的 from_tensor_slices可以非常方便的從list中將數據導入。

很多時候我們都需要對圖片進行預處理,比如我們需要做一個檢測數據集,我們要讀入label和bbox,這個時候label需要one-hot,我們就需要對這個東西進行預處理,這個時候map就有用了。

tf.data.Dataset.map

這還沒有完,我們的目的是操作每一張圖片,做一些變換。或者對label進行一些處理,比如one-hot。在最新的dataset API中也有map函數進行操作。可以在這個map方法里,指定所有應有的操作。

def input_map_fn(img_path, label): # do some process to label one_hot = tf.one_hot(label, NUMC_CLASSES) img_f = tf.read_file(img_path) img_decodes = tf.image.decode_image(img_f, channels=3) return img_decodes, one_hot

然後將train_data加上即可。

train_data = train_data.map(input_map_fn)

最終我們可以看到熟悉的,圖片值 + one_hot label的訓練數據。如果是對於像多標籤分類,目標檢測這樣的任務label,也是做同樣的處理。只要能保證前期的輸入能在後期的網路中拿到就行了。

好了,現在tensorflow全新的數據導入API應該已經融會貫通了。下一篇大家等待更新,博主這還得去鄉下拜個年。

推薦閱讀:

TAG:TensorFlow | 人工智慧AI醬 | Python入門 |