TensorFlow實現神經網絡入門篇
更多深度文章,請關注雲計算頻道:https://yq.aliyun.com/cloud
如果你一直關注數據科學/機器學習,你就不能錯過深度學習和神經網絡的熱潮。互聯網公司正在尋找這方麵的人,而且從競賽到開源項目,都有巨額獎金。
如果你對深度學習所提供的前景感到興奮,但是還沒有開始,在這裏或許是你開始的第一步。
在這篇文章中,我將介紹TensorFlow。閱讀本文後,你將能夠理解神經網絡的應用,並使用TensorFlow解決現實生活中的問題,本文中的代碼是用Python編寫的,Python最近的火爆也和深度學習有關。
1:何時使用神經網絡?
有關神經網絡和深度學習的更詳細的解釋, 請看這裏。其“更深”版本正在圖像識別,語音和自然語言處理等諸多領域取得巨大突破。
現在的主要問題是何時使用神經網絡?關於這點,你必須記住一些事情:
1.1:神經網絡需要大量的信息數據來訓練。將神經網絡想象成一個孩子。它首先觀察父母如何走路。然後它才會獨立行走,並且每走一步,孩子都會學習如何執行特定的任務。如果你不讓它走,它可能永遠不會學習如何走路。你可以提供給孩子的“數據”越多,效果就越好。
1.2:當你有適當類型的神經網絡來解決問題時。 每個問題都有自己的難點。數據決定了你解決問題的方式。例如,如果問題是序列生成,遞歸神經網絡更適合,而如果它是一個圖像相關的問題,你可能會采取卷積神經網絡。
1.3:硬件要求對於運行深度神經網絡模型是至關重要的。神經網絡很早以前就被“發現”了,但是近年來,神經網絡一直在發光,這是因為計算能力的強大。如果你想用這些網絡解決現實生活中的問題,準備購買一些高性能硬件吧!
2:如何解決神經網絡問題?
神經網絡是一種特殊類型的機器學習(ML)算法。因此,與每個ML算法一樣,它遵循數據預處理,模型構建和模型評估等常規ML工作流程。我列出了一個如何處理神經網絡問題的待辦事項清單。
1.檢查神經網絡是否可以提升傳統算法。
2.做一個調查,哪個神經網絡架構最適合即將解決的問題。
3.通過你選擇的語言/庫來定義神經網絡架構。
4.將數據轉換為正確的格式,並將其分成批。
5.根據你的需要預處理數據。
6.增加數據以增加規模並製作更好的訓練模型。
7.將數據批次送入神經網絡。
8.訓練和監測訓練集和驗證數據集的變化。
9.測試你的模型,並保存以備將來使用。
本文中,我將重點關注圖像數據。讓我們先了解一下,然後再研究TensorFlow。
圖像大多排列為3D陣列,尺寸指的是高度,寬度和顏色通道。例如,如果你現在截取了你的電腦的屏幕截圖,則會首先將其轉換為3D數組,然後將其壓縮為PNG或JPG文件格式。
雖然這些圖像對於人來說是相當容易理解的,但計算機很難理解它們。這種現象被稱為語義鴻溝。我們的大腦可以查看圖像,並在幾秒鍾內了解完整的圖片。另一方麵,計算機將圖像視為一組數字。
在早期,人們試圖把圖像分解成像“模板”這樣的“可理解的”格式。例如,一張臉總是有一個特定的結構,這個結構在每個人身上都有所保留,比如眼睛的位置和鼻子,或我們的臉的形狀。但是這種方法並不可行,因為當要識別的對象的數量增加時,“模板”就不會成立。
2012年,深度神經網絡架構贏得了ImageNet的挑戰,這是一個從自然場景中識別物體的重大挑戰。
那麼人們通常使用哪種庫/語言來解決圖像識別問題?一個最近的一項調查發現,最流行的深度學習庫是Python提供的API,其次是Lua中,Java和Matlab的。最流行的庫是:
讓我們來看看TensorFlow所提供的功能。 什麼是TensorFlow?
“TensorFlow是一個使用數據流圖進行數值計算的開源軟件庫。圖中的節點表示數學運算,而圖邊表示在它們之間傳遞的多維數據陣列(又稱張量)。靈活的體係結構允許你使用單個API將計算部署到桌麵、服務器或移動設備中的一個或多個CPU或GPU。“
如果你之前曾經使用過numpy,那麼了解TensorFlow將會是小菜一碟!numpy和TensorFlow之間的一個主要區別是TensorFlow遵循一個“懶惰”的編程範例。它首先建立所有要完成的操作圖形,然後當一個“會話”被調用時,它再“運行”圖形。構建一個計算圖可以被認為是TensorFlow的主要成分。要了解更多關於計算圖的數學構成,請閱讀這篇文章。
TensorFlow不僅僅是一個強大的神經網絡庫。它可以讓你在其上構建其他機器學習算法,如決策樹或k最近鄰。
使用TensorFlow的優點是:
1.它有一個直觀的結構,因為顧名思義,它有一個“張量流”。 你可以很容易地看到圖的每一個部分。
2.輕鬆地在CPU / GPU上進行分布式計算。
3.平台靈活性。你可以在任何地方運行模型,無論是在移動設備,服務器還是PC上。
3.典型的“張量流”
每個庫都有自己的“實施細節”,即按照其編碼模式編寫的一種方法。例如,在執行scikit-learn時,首先創建所需算法的對象,然後在訓練集上構建一個模型,並對測試集進行預測。例如:
# 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中運行程序的通常工作流程如下所示:
1.建立一個計算圖。這可以是TensorFlow支持的任何數學操作。
2.初始化變量。
3.創建會話。
4.在會話中運行圖形。
5.關閉會話。
接下來,讓我們寫一個小程序來添加兩個數字!
# 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()
4.在TensorFlow中實現神經網絡
注意:我們可以使用不同的神經網絡體係結構來解決這個問題,但是為了簡單起見,我們需要實現前饋多層感知器。
神經網絡的常見的實現如下:
1.定義要編譯的神經網絡體係結構。
2.將數據傳輸到你的模型。
3.將數據首先分成批次,然後進行預處理。
4.然後將其加入神經網絡進行訓練。
5.顯示特定的時間步數的準確度。
6.訓練結束後保存模型以供將來使用。
7.在新數據上測試模型並檢查其執行情況。
我們的問題是識別來自給定的28x28圖像的數字。我們有一部分圖像用於訓練,剩下的則用於測試我們的模型。所以首先下載數據集,數據集包含數據集中所有圖像的壓縮文件:train.csv
和test.csv
。數據集中不提供任何附加功能,隻是以“.png”格式的原始圖像。
我們將使用TensorFlow來建立一個神經網絡模型。所以你應該先在你的係統中安裝TensorFlow。 根據你的係統規格,請參閱官方安裝指南進行安裝。
我們將按照上述模板進行操作。用Python 2.7內核創建一個Jupyter筆記本,並按照下麵的步驟。
導入所有必需的模塊:
%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
設置初始值,以便我們可以控製模型的隨機性:
# To stop potential randomness
seed = 128
rng = np.random.RandomState(seed)
第一步是設置保管目錄路徑:
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)
讓我們看看數據集。這些格式為CSV格式,並且具有相應標簽的文件名:
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()
讓我們看看我們的數據是什麼樣的!
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數組,如下所示:
為了更簡單的數據處理,讓我們將所有的圖像存儲為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問題,為了測試我們模型的正確功能,我們創建了一個驗證集。
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:]
現在,我們定義一些輔助函數,我們稍後使用它:
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, input_num_units)
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
我們來定義我們的神經網絡架構。我們定義了一個三層神經網絡:輸入,隱藏和輸出。輸入和輸出中神經元的數量是固定的,因為輸入的是28x28圖像,輸出的是10x1向量。我們隱藏層中有500個神經元。這個數字可以根據你的需要而有所不同。閱讀文章以獲得完整的代碼,並深入了解它的工作原理。
本文由阿裏雲雲棲社區組織翻譯。
文章原標題《An Introduction to Implementing Neural Networks Using TensorFlow》
作者:Faizan Shaikh 數據科學家 印度人 譯者:虎說八道
文章為簡譯,更為詳細的內容,請查看原文
最後更新:2017-11-16 19:34:13