使用 TensorFlow 實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)

介紹

一直關(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ì)于文章的理解。

目錄

<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()

上面的圖像表示為 numpy 數(shù)組红选,如下所示

  • 為了方便數(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))

  • 設(shè)置優(yōu)化器茶行,即我們的反向傳播算法躯概。 這里我們使用 Adam ,這是梯度下降算法的高效變體畔师。 有在 tensorflow 可用許多其它優(yōu)化(參照 此處

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

  • 我們看到的模型性能是相當(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。

參考資源

關(guān)于原文

感謝原文作者 Faizan Shaikh 的分享,
這篇文章是在 An Introduction to Implementing Neural Networks using TensorFlow 的基礎(chǔ)上做的翻譯和局部調(diào)整笨篷,如果發(fā)現(xiàn)翻譯中有不對(duì)或者歧義的的地方歡迎在下面評(píng)論里提問瞳秽,我會(huì)加以修正 。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末率翅,一起剝皮案震驚了整個(gè)濱河市练俐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌冕臭,老刑警劉巖腺晾,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異辜贵,居然都是意外死亡悯蝉,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門托慨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鼻由,“玉大人,你說我怎么就攤上這事厚棵〗妒溃” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵窟感,是天一觀的道長(zhǎng)讨彼。 經(jīng)常有香客問我,道長(zhǎng)柿祈,這世上最難降的妖魔是什么哈误? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮躏嚎,結(jié)果婚禮上蜜自,老公的妹妹穿的比我還像新娘。我一直安慰自己卢佣,他們只是感情好重荠,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著虚茶,像睡著了一般戈鲁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嘹叫,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天婆殿,我揣著相機(jī)與錄音,去河邊找鬼罩扇。 笑死婆芦,一個(gè)胖子當(dāng)著我的面吹牛怕磨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播消约,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼肠鲫,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了或粮?” 一聲冷哼從身側(cè)響起导饲,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎被啼,沒想到半個(gè)月后帜消,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡浓体,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年泡挺,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片命浴。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡娄猫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出生闲,到底是詐尸還是另有隱情媳溺,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布碍讯,位于F島的核電站悬蔽,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏捉兴。R本人自食惡果不足惜蝎困,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望倍啥。 院中可真熱鬧禾乘,春花似錦、人聲如沸虽缕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽氮趋。三九已至伍派,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間剩胁,已是汗流浹背拙已。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留摧冀,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像索昂,于是被迫代替她去往敵國和親建车。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容