介紹
一直關(guān)注 數(shù)據(jù)科學(xué)
蒸健、 機(jī)器學(xué)習(xí)
的同學(xué)座享,一定會(huì)經(jīng)常看到或聽到關(guān)于 深度學(xué)習(xí)
和 神經(jīng)網(wǎng)絡(luò)
相關(guān)信息似忧。如果你對(duì) 深度學(xué)習(xí)
感興趣渣叛,但卻還沒有實(shí)際動(dòng)手操作過,你可以從這里得到實(shí)踐盯捌。
在本文中淳衙,我將介紹 TensorFlow
, 幫你了解 神經(jīng)網(wǎng)絡(luò)
的實(shí)際作用,并使用 TensorFlow
來解決現(xiàn)實(shí)生活中的問題饺著。 讀這篇文章前箫攀,需要知道 神經(jīng)網(wǎng)絡(luò)
的基礎(chǔ)知識(shí)和一些熟悉編程理念,文章中的代碼是使用 Pyhton
編寫的幼衰,所以還需要了解一些 Python
的基本語法靴跛,才能更有利對(duì)于文章的理解。
目錄
- 什么時(shí)候應(yīng)用神經(jīng)網(wǎng)絡(luò)渡嚣?
- 通常神經(jīng)網(wǎng)絡(luò)能解決的問題
- 了解圖像數(shù)據(jù)和主流的庫來解決問題
- 什么是 TensorFlow梢睛?
- TensorFlow 一個(gè) 典型 的 “ 流 ”
- 在 TensorFlow 中實(shí)現(xiàn) MLP
- TensorFlow 的限制
- TensorFlow 與其他庫
- 從這里去哪里肥印?
<a name="When-to-apply-neural-net"></a>什么時(shí)候用神經(jīng)網(wǎng)絡(luò)?
神經(jīng)網(wǎng)絡(luò)
已經(jīng)在相當(dāng)一段時(shí)間成為機(jī)器學(xué)習(xí)中的焦點(diǎn)绝葡。 對(duì)于 神經(jīng)網(wǎng)絡(luò)
和 深度學(xué)習(xí)
上這里有更詳細(xì)的解釋 點(diǎn)擊閱讀 深碱。 其 “更深” 的功能在許多領(lǐng)域都有取得巨大的突破,如圖像識(shí)別藏畅,語音和自然語言處理等敷硅。
主要的問題在于如何用好 神經(jīng)網(wǎng)絡(luò)
?現(xiàn)在墓赴,每天都會(huì)有許多新發(fā)現(xiàn)竞膳,這個(gè)領(lǐng)域就像一個(gè)金礦,為了成為這個(gè) “淘金熱” 的一部分诫硕,必須記住幾件事:
首先,
神經(jīng)網(wǎng)絡(luò)
需要有明確和翔實(shí)的數(shù)據(jù)(主要是大數(shù)據(jù))訓(xùn)練刊侯, 試著想象神經(jīng)網(wǎng)絡(luò)
作為一個(gè)孩子章办,它一開始會(huì)觀察它父母走路,然后它試圖自己走滨彻,每一步就像學(xué)習(xí)執(zhí)行一個(gè)特定的任務(wù)藕届。 它可能會(huì)失敗幾次,但經(jīng)過幾次失敗的嘗試亭饵,它將會(huì)如何走路休偶。所以需要為孩子提供更多的機(jī)會(huì),如果不讓它走辜羊,它可能永遠(yuǎn)不會(huì)學(xué)習(xí)如何走路踏兜。一些人會(huì)利用
神經(jīng)網(wǎng)絡(luò)
解決復(fù)雜的問題,如圖像處理八秃,神經(jīng)網(wǎng)絡(luò)
屬于一類代表學(xué)習(xí)的算法碱妆,這些算法可以把復(fù)雜的問題分解為簡(jiǎn)單的形式,使他們成為可以理解的(或 “可表示”)昔驱,就像吞咽食物之前的咀嚼疹尾,讓我們更容易吸收和消化。這個(gè)分解的過程如果使用傳統(tǒng)的算法來實(shí)現(xiàn)也可以骤肛,但是實(shí)現(xiàn)過程將會(huì)很困難纳本。選擇適當(dāng)類型的
神經(jīng)網(wǎng)絡(luò)
,來解決問題腋颠, 每個(gè)問題的復(fù)雜情況都不一樣繁成,所以數(shù)據(jù)決定你解決問題的方式。 例如秕豫,如果問題是序列生成的問題朴艰,遞歸神經(jīng)網(wǎng)絡(luò)
更合適观蓄。如果它是圖像相關(guān)的問題,想更好地解決可以采取卷積神經(jīng)網(wǎng)絡(luò)
祠墅。最后最重要的就是
硬件
要求了瓷蛙,硬件是運(yùn)行神經(jīng)網(wǎng)絡(luò)
模型的關(guān)鍵。 神經(jīng)網(wǎng)被 “發(fā)現(xiàn)” 很久以前非区,他們?cè)诮陙淼玫酵瞥绲闹饕脑蚓褪怯?jì)算資源更好娘纷,能更大發(fā)揮它的光芒,如果你想使用神經(jīng)網(wǎng)絡(luò)
解決這些現(xiàn)實(shí)生活中的問題狗准,那么你得準(zhǔn)備購買一些高端的硬件了??克锣!
<a name="solve-problems"></a>通常神經(jīng)網(wǎng)絡(luò)解決的問題
神經(jīng)網(wǎng)絡(luò)是一種特殊類型的 機(jī)器學(xué)習(xí)(ML)算法。 因此腔长,作為每個(gè) ML 算法都遵循 數(shù)據(jù)預(yù)處理 袭祟、模型建立 和 模型評(píng)估 的工作流流程。為了簡(jiǎn)明起見捞附,下面列出了如何處理 神經(jīng)網(wǎng)絡(luò)
問題的 TODO 列表巾乳。
- 檢查它是否為 神經(jīng)網(wǎng)絡(luò) ,把它看成一個(gè)傳統(tǒng)的算法問題
- 做一個(gè)調(diào)查鸟召,哪個(gè) 神經(jīng)網(wǎng)絡(luò) 框架最適合解決這個(gè)問題
- 定義 神經(jīng)網(wǎng)絡(luò) 框架胆绊,通過它選擇對(duì)應(yīng)的 編程語言 和 庫
- 將數(shù)據(jù)轉(zhuǎn)換為正確的格式并分批分割
- 根據(jù)您的需要預(yù)處理數(shù)據(jù)
- 增強(qiáng)數(shù)據(jù)以增加大小并制作更好的訓(xùn)練模型
- 批次供給到 神經(jīng)網(wǎng)絡(luò)
- 訓(xùn)練和監(jiān)測(cè),培訓(xùn)和驗(yàn)證數(shù)據(jù)集的變化
- 測(cè)試你的模型欧募,并保存以備將來使用
本文將專注于圖像數(shù)據(jù)压状,我們從 TensorFlow 入手。
<a name="popular-libraries"></a>了解圖像數(shù)據(jù)和主流的庫來解決問題
圖像大多排列為 3-D 陣列跟继,具體指 高度种冬、寬度 和 顏色通道。例如还栓,如果你使用電腦截屏碌廓,它將首先轉(zhuǎn)換成一個(gè) 3-D 數(shù)組,然后壓縮它為 '.jpeg' 或 '.png' 文件格式剩盒。
雖然這些圖像對(duì)于人類來說很容易理解谷婆,但計(jì)算機(jī)很難理解它們。 這種現(xiàn)象稱為“語義空隙”辽聊。我們的大腦可以看看圖像纪挎,并在幾秒鐘內(nèi)讀懂完整的圖片。但計(jì)算機(jī)會(huì)將圖像看作一個(gè)數(shù)字?jǐn)?shù)組跟匆,問題來了异袄,它想知道這是一張什么樣的圖像,我們應(yīng)該怎么樣把圖像解釋給機(jī)器它才能讀懂玛臂?
在早期烤蜕,人們?cè)噲D將圖像分解為機(jī)器的 “可理解” 格式封孙,如“模板”。例如讽营,面部總是具有在每個(gè)人中有所保留的特定結(jié)構(gòu)虎忌,例如眼睛,鼻子或我們的臉的形狀橱鹏。 但是這種方法將是有缺陷的膜蠢,因?yàn)楫?dāng)要識(shí)別的對(duì)象的數(shù)量將增加到一定量級(jí)時(shí),“模板” 將不成立莉兰。
2012年一個(gè)深層神經(jīng)網(wǎng)絡(luò)架構(gòu)贏得了 ImageNet 的挑戰(zhàn)挑围,從自然場(chǎng)景中識(shí)別對(duì)象,它在即將到來的 ImageNet 挑戰(zhàn)中繼續(xù)統(tǒng)治其主權(quán)糖荒,從而證明了解決圖像問題的有用性杉辙。
人們通常使用哪些 庫 / 語言 來解決圖像識(shí)別問題?最近的一次調(diào)查中寂嘉,最流行的深度學(xué)習(xí)庫奏瞬,支持的最友好的語言有 Python ,其次是 Lua 泉孩,對(duì) Java 和 Matlab 支持的也有。最流行的庫舉幾個(gè)例子:
現(xiàn)在并淋,我們了解了圖像的存儲(chǔ)方式以及使用的常用庫寓搬,讓我們看看 TensorFlow
提供的功能。
<a name="What-is-TensorFlow"></a>什么是 TensorFlow 县耽?
讓我們從官方定義開始.
“TensorFlow
是一個(gè)開源軟件庫句喷,用于使用數(shù)據(jù)流圖進(jìn)行數(shù)值計(jì)算。圖中的節(jié)點(diǎn)表示數(shù)學(xué)運(yùn)算兔毙,而圖邊表示在它們之間傳遞的多維數(shù)據(jù)陣列(也稱為張量)唾琼。 靈活的架構(gòu)允許您使用單一 API 將計(jì)算部署到桌面、服務(wù)器或移動(dòng)設(shè)備中的一個(gè)或多個(gè)的 CPU 或 GPU 中澎剥。
如果感覺這聽起來太高大上锡溯,不要擔(dān)心。這里有我簡(jiǎn)單的定義哑姚,TensorFlow
看起來沒什么祭饭,只是 numpy 有些難以理解。如果你以前使用過 numpy 叙量,理解 TensorFlow 將是手到擒來倡蝙! numpy 和 TensorFlow 之間的主要區(qū)別是 TensorFlow 遵循惰性編程范例。 TensorFlow 的操作基本上都是對(duì) session 的操作绞佩,它首先構(gòu)建一個(gè)所有操作的圖形寺鸥,當(dāng)我們調(diào)用 session 時(shí) TensorFlow 就開始工作了猪钮。它通過將內(nèi)部數(shù)據(jù)表示轉(zhuǎn)換為張量(Tensor,也稱為多維數(shù)組)來構(gòu)建為可擴(kuò)展的胆建。 構(gòu)建計(jì)算圖可以被認(rèn)為是 TensorFlow 的主要成分烤低。想更多地了解一個(gè)計(jì)算圖形的數(shù)學(xué)結(jié)構(gòu),可以閱讀 這篇文章 眼坏。
通過上面的介紹拂玻,很容易將 TensorFlow 分類為神經(jīng)網(wǎng)絡(luò)庫,但它不僅僅是如此宰译。它被設(shè)計(jì)成一個(gè)強(qiáng)大的神經(jīng)網(wǎng)絡(luò)庫檐蚜, 但它有能力做更多的事情⊙爻蓿可以構(gòu)建它為其他機(jī)器學(xué)習(xí)算法闯第,如 決策樹 或 k-最近鄰,你可以從字面上理解缀拭,你可以做一切你在 numpy 上能做的事情咳短!我們暫且稱它為 “全能的 numpy” 。
使用 TensorFlow 的優(yōu)點(diǎn)是:
- 它有一個(gè)直觀的結(jié)構(gòu) 蛛淋,顧名思義它有 “張量流”咙好,你可以輕松地可視每個(gè)圖中的每一個(gè)部分。
- 輕松地在 cpu / gpu 上進(jìn)行分布式計(jì)算
- 平臺(tái)的靈活性 褐荷」葱В可以隨時(shí)隨地運(yùn)行模型,無論是在移動(dòng)端叛甫、服務(wù)器還是 PC 上层宫。
<a name="A-typical-flow"></a>TensorFlow 的典型 “流”
每個(gè)庫都有自己的“實(shí)現(xiàn)細(xì)節(jié)”,即一種寫其遵循其編碼范例的方式其监。 例如萌腿,當(dāng)實(shí)現(xiàn) scikit-learn 時(shí),首先創(chuàng)建所需算法的對(duì)象抖苦,然后在訓(xùn)練和測(cè)試集上構(gòu)建一個(gè)模型獲得預(yù)測(cè)毁菱,如下所示:
# define hyperparamters of ML algorithm
clf = svm.SVC(gamma=0.001, C=100.)
# train
clf.fit(X, y)
# test
clf.predict(X_test)
正如我前面所說,TensorFlow 遵循一種懶惰的方法睛约。 在 TensorFlow 中運(yùn)行程序的通常工作流程如下:
- 建立一個(gè)計(jì)算圖鼎俘, 任何的數(shù)學(xué)運(yùn)算可以使用 TensorFlow 支撐。
- 初始化變量辩涝, 編譯預(yù)先定義的變量
- 創(chuàng)建 session贸伐, 這是神奇的開始的地方 !
- 在 session 中運(yùn)行圖怔揩, 編譯圖形被傳遞到 session 捉邢,它開始執(zhí)行它脯丝。
- 關(guān)閉 session, 結(jié)束這次使用伏伐。
TensoFlow 中使用的術(shù)語很少
placeholder:將數(shù)據(jù)輸入圖形的一種方法
feed_dict:將數(shù)值傳遞到計(jì)算圖的字典
讓我們寫一個(gè)小程序來添加兩個(gè)數(shù)字宠进!
# import tensorflow
import tensorflow as tf
# build computational graph
a = tf.placeholder(tf.int16)
b = tf.placeholder(tf.int16)
addition = tf.add(a, b)
# initialize variables
init = tf.initialize_all_variables()
# create session and run the graph
with tf.Session() as sess:
sess.run(init)
print "Addition: %i" % sess.run(addition, feed_dict={a: 2, b: 3})
# close session
sess.close()
<a name="MLP"></a>在 TensorFlow 中實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)
注意:我們可以使用不同的神經(jīng)網(wǎng)絡(luò)體系結(jié)構(gòu)來解決這個(gè)問題,但是為了簡(jiǎn)單起見藐翎,我們?cè)谏钊雽?shí)施中討論 前饋多層感知器
材蹬。
讓我們記住對(duì)神經(jīng)網(wǎng)絡(luò)的了解。
神經(jīng)網(wǎng)絡(luò)的典型實(shí)現(xiàn)如下:
- 定義要編譯的神經(jīng)網(wǎng)絡(luò)體系結(jié)構(gòu)
- 將數(shù)據(jù)傳輸?shù)侥P?/li>
- 整個(gè)運(yùn)行中吝镣,數(shù)據(jù)首先被分成批次堤器,以便它可以被攝取。首先對(duì)批次進(jìn)行預(yù)處理末贾,擴(kuò)增闸溃,然后送入神經(jīng)網(wǎng)絡(luò)進(jìn)行訓(xùn)練
- 然后,模型被逐步地訓(xùn)練
- 顯示特定數(shù)量的時(shí)間步長(zhǎng)的精度
- 訓(xùn)練后保存模型供將來使用
- 在新數(shù)據(jù)上測(cè)試模型并檢查其運(yùn)行方式
在這里拱撵,我們解決了我們深刻的學(xué)習(xí)實(shí)踐中的問題 - [識(shí)別數(shù)字]辉川,讓再我們花一點(diǎn)時(shí)間看看問題陳述。
我們的問題是圖像識(shí)別拴测,以識(shí)別來自給定的 28×28 圖像的數(shù)字乓旗。 我們有一個(gè)圖像子集用于訓(xùn)練,其余的用于測(cè)試我們的模型集索。首先下載訓(xùn)練和測(cè)試文件寸齐。數(shù)據(jù)集包含數(shù)據(jù)集中所有圖像的壓縮文件, train.csv 和 test.csv 都有相應(yīng)的訓(xùn)練和測(cè)試圖像的名稱抄谐。數(shù)據(jù)集中不提供任何其他功能,只是原始圖像以 “.png” 格式提供扰法。
如之前說的蛹含,我們將使用 TensorFlow 來創(chuàng)建一個(gè)神經(jīng)網(wǎng)絡(luò)模型。 所以首先在你的系統(tǒng)中安裝 TensorFlow 塞颁。 請(qǐng)參考 官方的安裝指南 進(jìn)行安裝浦箱,按您的系統(tǒng)規(guī)格。
我們將按照上述模板
- 讓我們來 導(dǎo)入所有需要的模塊
%pylab inline
import os
import numpy as np
import pandas as pd
from scipy.misc import imread
from sklearn.metrics import accuracy_score
import tensorflow as tf
- 讓我們來 設(shè)置一個(gè)種子值祠锣,這樣我們就可以控制我們的模型隨機(jī)性
# To stop potential randomness
seed = 128
rng = np.random.RandomState(seed)
- 第一步是設(shè)置目錄路徑酷窥,以便保管!
root_dir = os.path.abspath('../..')
data_dir = os.path.join(root_dir, 'data')
sub_dir = os.path.join(root_dir, 'sub')
# check for existence
os.path.exists(root_dir)
os.path.exists(data_dir)
os.path.exists(sub_dir)
- 現(xiàn)在讓我們讀取我們的數(shù)據(jù)集伴网,這些是 .csv 格式蓬推,并有一個(gè)文件名以及相應(yīng)的標(biāo)簽
train = pd.read_csv(os.path.join(data_dir,'Train'澡腾,'train.csv'))
test = pd.read_csv(os.path.join(data_dir沸伏,'Test.csv'))
sample_submission = pd.read_csv(os.path.join(data_dir糕珊,'Sample_Submission.csv'))
train.head()
文件名 | 標(biāo)簽 | |
---|---|---|
0 | 0.png | 4 |
1 | 1.png | 9 |
2 | 2.png | 1 |
3 | 3.png | 7 |
4 | 4.png | 3 |
- 讓我們看看我們的數(shù)據(jù)是什么樣子!我們讀取我們的形象并顯示出來毅糟。
img_name = rng.choice(train.filename)
filepath = os.path.join(data_dir, 'Train', 'Images', 'train', img_name)
img = imread(filepath, flatten=True)
pylab.imshow(img, cmap='gray')
pylab.axis('off')
pylab.show()
![](https://www.analyticsvidhya.com/wp-content/uploads/2016/10/3.png)
上面的圖像表示為 numpy 數(shù)組红选,如下所示
![](https://www.analyticsvidhya.com/wp-content/uploads/2016/10/one.png)
- 為了方便數(shù)據(jù)操作,讓我們 的存儲(chǔ)作為 numpy 的陣列的所有圖片
temp = []
for img_name in train.filename:
image_path = os.path.join(data_dir, 'Train', 'Images', 'train', img_name)
img = imread(image_path, flatten=True)
img = img.astype('float32')
temp.append(img)
train_x = np.stack(temp)
temp = []
for img_name in test.filename:
image_path = os.path.join(data_dir, 'Train', 'Images', 'test', img_name)
img = imread(image_path, flatten=True)
img = img.astype('float32')
temp.append(img)
test_x = np.stack(temp)
- 由于這是典型的 ML 問題姆另,為了測(cè)試我們的模型的正確功能喇肋,我們創(chuàng)建一個(gè)驗(yàn)證集,讓我們以 70:30 的分割訓(xùn)練集 和 驗(yàn)證集
split_size = int(train_x.shape[0]*0.7)
train_x, val_x = train_x[:split_size], train_x[split_size:]
train_y, val_y = train.label.values[:split_size], train.label.values[split_size:]
- 我們定義一些輔助函數(shù)迹辐,我們稍后在我們的程序中使用
def dense_to_one_hot(labels_dense, num_classes=10):
"""Convert class labels from scalars to one-hot vectors"""
num_labels = labels_dense.shape[0]
index_offset = np.arange(num_labels) * num_classes
labels_one_hot = np.zeros((num_labels, num_classes))
labels_one_hot.flat[index_offset + labels_dense.ravel()] = 1
return labels_one_hot
def preproc(unclean_batch_x):
"""Convert values to range 0-1"""
temp_batch = unclean_batch_x / unclean_batch_x.max()
return temp_batch
def batch_creator(batch_size, dataset_length, dataset_name):
"""Create batch with random samples and return appropriate format"""
batch_mask = rng.choice(dataset_length, batch_size)
batch_x = eval(dataset_name + '_x')[[batch_mask]].reshape(-1, 784)
batch_x = preproc(batch_x)
if dataset_name == 'train':
batch_y = eval(dataset_name).ix[batch_mask, 'label'].values
batch_y = dense_to_one_hot(batch_y)
return batch_x, batch_y
- 主要部分蝶防! 讓我們定義我們的神經(jīng)網(wǎng)絡(luò)架構(gòu)。 我們定義一個(gè)神經(jīng)網(wǎng)絡(luò)具有 3 層右核,輸入慧脱、隱藏 和 輸出, 輸入和輸出中的神經(jīng)元數(shù)目是固定的贺喝,因?yàn)檩斎胧俏覀兊?28×28 圖像菱鸥,并且輸出是表示類的 10×1 向量。 我們?cè)陔[藏層中取 500 神經(jīng)元躏鱼。這個(gè)數(shù)字可以根據(jù)你的需要變化氮采。我們把值 賦給 其余變量。 可以閱讀 神經(jīng)網(wǎng)絡(luò)的基礎(chǔ)知識(shí)的文章 染苛,以更深的了解它是如何工作鹊漠。
### set all variables
# number of neurons in each layer
input_num_units = 28*28
hidden_num_units = 500
output_num_units = 10
# define placeholders
x = tf.placeholder(tf.float32, [None, input_num_units])
y = tf.placeholder(tf.float32, [None, output_num_units])
# set remaining variables
epochs = 5
batch_size = 128
learning_rate = 0.01
### define weights and biases of the neural network (refer this article if you don't understand the terminologies)
weights = {
'hidden': tf.Variable(tf.random_normal([input_num_units, hidden_num_units], seed=seed)),
'output': tf.Variable(tf.random_normal([hidden_num_units, output_num_units], seed=seed))
}
biases = {
'hidden': tf.Variable(tf.random_normal([hidden_num_units], seed=seed)),
'output': tf.Variable(tf.random_normal([output_num_units], seed=seed))
}
- 現(xiàn)在創(chuàng)建我們的神經(jīng)網(wǎng)絡(luò)計(jì)算圖
hidden_layer = tf.add(tf.matmul(x, weights['hidden']), biases['hidden'])
hidden_layer = tf.nn.relu(hidden_layer)
output_layer = tf.matmul(hidden_layer, weights['output']) + biases['output']
- 此外,我們需要定義神經(jīng)網(wǎng)絡(luò)的成本
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(output_layer, y))
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)
- 定義我們的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)后娶靡,讓我們來 初始化所有的變量
init = tf.initialize_all_variables()
- 現(xiàn)在讓我們創(chuàng)建一個(gè) Session ,并在 Session 中運(yùn)行我們的神經(jīng)網(wǎng)絡(luò)看锉。我們還驗(yàn)證我們創(chuàng)建的驗(yàn)證集的模型準(zhǔn)確性
with tf.Session() as sess:
# create initialized variables
sess.run(init)
### for each epoch, do:
### for each batch, do:
### create pre-processed batch
### run optimizer by feeding batch
### find cost and reiterate to minimize
for epoch in range(epochs):
avg_cost = 0
total_batch = int(train.shape[0]/batch_size)
for i in range(total_batch):
batch_x, batch_y = batch_creator(batch_size, train_x.shape[0], 'train')
_, c = sess.run([optimizer, cost], feed_dict = {x: batch_x, y: batch_y})
avg_cost += c / total_batch
print "Epoch:", (epoch+1), "cost =", "{:.5f}".format(avg_cost)
print "\nTraining complete!"
# find predictions on val set
pred_temp = tf.equal(tf.argmax(output_layer, 1), tf.argmax(y, 1))
accuracy = tf.reduce_mean(tf.cast(pred_temp, "float"))
print "Validation Accuracy:", accuracy.eval({x: val_x.reshape(-1, 784), y: dense_to_one_hot(val_y.values)})
predict = tf.argmax(output_layer, 1)
pred = predict.eval({x: test_x.reshape(-1, 784)})
這將是上面代碼的輸出
Epoch: 1 cost = 8.93566
Epoch: 2 cost = 1.82103
Epoch: 3 cost = 0.98648
Epoch: 4 cost = 0.57141
Epoch: 5 cost = 0.44550
Training complete!
Validation Accuracy: 0.952823
- 驗(yàn)證我們自己的眼睛姿锭,讓我們來 想象它的預(yù)言
img_name = rng.choice(test.filename)
filepath = os.path.join(data_dir, 'Train', 'Images', 'test', img_name)
img = imread(filepath, flatten=True)
test_index = int(img_name.split('.')[0]) - 49000
print "Prediction is: ", pred[test_index]
pylab.imshow(img, cmap='gray')
pylab.axis('off')
pylab.show()
Prediction is: 8
![](https://www.analyticsvidhya.com/wp-content/uploads/2016/10/8.png)
- 我們看到的模型性能是相當(dāng)不錯(cuò)! 現(xiàn)在讓我們 創(chuàng)建一個(gè)提交
sample_submission.filename = test.filename
sample_submission.label = pred
sample_submission.to_csv(os.path.join(sub_dir, 'sub01.csv'), index=False)
終于完成了伯铣! 我們剛剛創(chuàng)建了自己的訓(xùn)練神經(jīng)網(wǎng)絡(luò)呻此!
<a name="Limitations-of-TensorFlow"></a>TensorFlow 的限制
- 盡管 TensorFlow 是強(qiáng)大的,它仍然是一個(gè)低水平庫腔寡,例如焚鲜,它可以被認(rèn)為是機(jī)器級(jí)語言,但對(duì)于大多數(shù)功能,您需要自己去模塊化和高級(jí)接口恃泪,如 keras
- 它仍然在繼續(xù)開發(fā)和維護(hù)郑兴,這是多么??啊贝乎!
- 它取決于你的硬件規(guī)格情连,配置越高越好
- 不是所有變成語言能使用它的 API 。
- TensorFlow 中仍然有很多庫需要手動(dòng)導(dǎo)入览效,比如 OpenCL 支持却舀。
上面提到的大多數(shù)是在 TensorFlow 開發(fā)人員的愿景,他們已經(jīng)制定了一個(gè)路線圖锤灿,計(jì)劃庫未來應(yīng)該如何開發(fā)挽拔。
<a name="vs-libraries"></a>TensorFlow 與其他庫
TensorFlow 建立在類似的原理,如使用數(shù)學(xué)計(jì)算圖表的 Theano 和 Torch但校,但是隨著分布式計(jì)算的額外支持螃诅,TensorFlow 更好地解決復(fù)雜的問題。 此外状囱,TensorFlow 模型的部署已經(jīng)被支持术裸,這使得它更容易用于工業(yè)目的,打開一些商業(yè)的三方庫亭枷,如 Deeplearning4j 袭艺,H2O 和 Turi。 TensorFlow 有用于 Python叨粘,C ++ 和 Matlab 的 API 猾编。 最近還出現(xiàn)了對(duì) Ruby 和 R 等其他語言的支持。因此升敲,TensorFlow 試圖獲得通用語言支持答倡。
<a name="Where-to-go-from-here"></a>從這里去哪里?
以上你看到了如何用 TensorFlow 構(gòu)建一個(gè)簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò)驴党,這段代碼是為了讓人們了解如何開始實(shí)現(xiàn) TensorFlow苇羡。 要解決更復(fù)雜的現(xiàn)實(shí)生活中的問題,你必須在這篇文章的基礎(chǔ)上在調(diào)整一些代碼才行鼻弧。
許多上述功能可以被抽象為給出無縫的端到端工作流,如果你使用 scikit-learn 锦茁,你可能知道一個(gè)高級(jí)庫如何抽象“底層”實(shí)現(xiàn)攘轩,給終端用戶一個(gè)更容易的界面。盡管 TensorFlow 已經(jīng)提取了大多數(shù)實(shí)現(xiàn)码俩,但是也有更高級(jí)的庫度帮,如 TF-slim 和 TFlearn。
參考資源
- TensorFlow 官方庫
- Rajat Monga(TensorFlow技術(shù)負(fù)責(zé)人) “TensorFlow為大家” 的視頻
- 一個(gè)專用資源的策劃列表
關(guān)于原文
感謝原文作者 Faizan Shaikh 的分享,
這篇文章是在 An Introduction to Implementing Neural Networks using TensorFlow 的基礎(chǔ)上做的翻譯和局部調(diào)整笨篷,如果發(fā)現(xiàn)翻譯中有不對(duì)或者歧義的的地方歡迎在下面評(píng)論里提問瞳秽,我會(huì)加以修正 。