本篇是神經(jīng)網(wǎng)絡(luò)體系搭建的第四篇,解決體系搭建的TensorFlow相關(guān)問題西土,詳見神經(jīng)網(wǎng)絡(luò)體系搭建(序)
TensorFlow安裝
建議用Anaconda酪术。
- Mac & Linux
conda create -n tensorflow python=3.5
source activate tensorflow
conda install pandas matplotlib jupyter notebook scikit-learn
conda install -c conda-forge tensorflow
- Windows
conda create -n tensorflow python=3.5
activate tensorflow
conda install pandas matplotlib jupyter notebook scikit-learn
conda install -c conda-forge tensorflow
TensorFlow的套路
初識TensorFlow,最不舒服的一點(diǎn)是:變量不能好好聲明定義翠储,非得用特定api封裝成tensor才能使用,而且必須到session里才能運(yùn)行橡疼。但是熟悉了它的套路之后也就習(xí)慣了援所,可以幫助打破以前的思維定式。
Session
TesorFlow的API構(gòu)建在computational graph概念上欣除,是一種對數(shù)學(xué)運(yùn)算過程可視化的方法住拭。session是運(yùn)行g(shù)raph的環(huán)境,分配GPU/CPU。這是和以往程序不同的一點(diǎn)滔岳,它是在session中運(yùn)行的杠娱,所以邏輯寫在session里。
數(shù)據(jù)封裝
在TensorFlow里谱煤,數(shù)據(jù)不以int摊求、string等方式存儲,而是以“tensor”的形式存在刘离。也就是說室叉,所有過去我們熟悉的基本類型,都得用它的api再包裝一遍硫惕,變成tensor茧痕,才能在session里用。
常量
- 關(guān)鍵字:
tf.constant()
import tensorflow as tf
s = tf.constant('hello world!') # 0 維度的字符串 tensor
i = tf.constant(123) # 0 維度的int32 tensor
a = tf.constant([123,324,235432]) # 1 維度的int32 tensor
m = tf.constant([123,324,235432],[23,342,3]) # 2 維度的int32 tensor
非常量
-
很多時候一開始沒有初值恼除,需要運(yùn)行時賦值踪旷,這時候就需要用
tf.placeholder()
。用tf.placeholder()
賦值的變量需要在session中用feed_dict設(shè)置值豁辉。x = tf.placeholder(tf.string) y = tf.placeholder(tf.int32) z = tf.placeholder(tf.float32) with tf.Session() as sess: output = sess.run(x, feed_dict={x: 'Test String', y: 123, z: 45.67}) print(output) # 輸出‘Test String’
-
還有一種是一開始有初值令野,后續(xù)需要不斷更改的,比如權(quán)重矩陣w這一類秋忙,需要用
tf.Variable
彩掐,用tf.Variable
聲明的變量必須在session用tf.global_variables_initializer()
初始化所有變量n_features = 120 n_labels = 5 weights = tf.Variable(tf.truncated_normal((n_features, n_labels))) bias = tf.Variable(tf.zeros(n_labels)) with tf.Session() as sess: sess.run(tf.global_variables_initializer()) print(sess.run(weights)) print(sess.run(bias ))
上述代碼
tf.truncated_normal()
表示取自一個正態(tài)分布的隨機(jī)值,tf.zeros()
函數(shù)返回一個都是 0 的 tensor灰追。
運(yùn)算
實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)算法避免不了加減乘除運(yùn)算堵幽,這里羅列幾個最基本的運(yùn)算:
-
x = tf.add(5, 2) # 7
-
減
tf.subtract
x = tf.subtract(10, 4) # 6
-
乘
tf.multiply
x = multiply(2, 5) # 10
-
除
tf.divide
# 除需要做一下類型轉(zhuǎn)換,轉(zhuǎn)成同一類型才能相除弹澎,否則會報(bào)錯 x = tf.divide(tf.cast(tf.constant(10), tf.float32), tf.cast(tf.constant(2), tf.float32)) # 5.0
-
矩陣乘法
tf.matmul
def linear(input, w, b): """ Return linear function in TensorFlow :param input: TensorFlow input :param w: TensorFlow weights :param b: TensorFlow biases :return: TensorFlow linear function """ # TODO: Linear Function (xW + b) return tf.add(tf.matmul(input, w), b)
-
自然對數(shù)
tf.log()
x = tf.log(100) # 4.60517
batch
batch在TensorFlow中經(jīng)常出現(xiàn)朴下。它指一次訓(xùn)練數(shù)據(jù)的一小部分,而不是一整個數(shù)據(jù)集苦蒿,這可以減少內(nèi)存占用殴胧。雖然從運(yùn)算角度講是低效的,但是總比在一些內(nèi)存低的電腦上不能運(yùn)行強(qiáng)佩迟。這是它產(chǎn)生的初衷团滥。
可以看一個計(jì)算:
一個float32 占4個字節(jié),則
train_features Shape: (55000, 784) Type: float32
占55000x784x4=172480000字節(jié)
train_labels Shape: (55000, 10) Type: float32
占55000x10x4=2200000字節(jié)
weights Shape: (784, 10) Type: float32
占784x10x4=31360字節(jié)
bias Shape: (10,) Type: float32
占10x4=40字節(jié)
輸入报强、權(quán)重和偏置項(xiàng)總共的內(nèi)存空間需求是 174MB灸姊,并不是太多。你可以在 CPU 和 GPU 上訓(xùn)練整個數(shù)據(jù)集秉溉。
但將來你要用到的數(shù)據(jù)集可能是以 G 來衡量力惯,甚至更多碗誉。你可以買更多的內(nèi)存,但是會很貴父晶。
和隨機(jī)梯度下降結(jié)合起來也很好用哮缺。因此每次訓(xùn)練對數(shù)據(jù)混洗,取一個batch甲喝,對每個batch用梯度下降求權(quán)重尝苇,因?yàn)閎atch是隨機(jī)的,所以其實(shí)是在對每個batch做隨機(jī)梯度下降俺猿。
batch的計(jì)算方法(用例取自優(yōu)達(dá)學(xué)城)
例如有 1000 個數(shù)據(jù)點(diǎn)茎匠,想每個 batch 有 128 個數(shù)據(jù)。但是 1000 無法被 128 整除押袍。你得到的結(jié)果是其中 7 個 batch 有 128 個數(shù)據(jù)點(diǎn)诵冒,1個 batch 有 104 個數(shù)據(jù)點(diǎn)。(7128 + 1104 = 1000)
batch 里面的數(shù)據(jù)點(diǎn)數(shù)量會不同的情況下谊惭,需要利用 TensorFlow 的 tf.placeholder()
函數(shù)來接收這些不同的 batch汽馋。
繼續(xù)上述例子,如果每個樣本有 n_input = 784 特征圈盔,n_classes = 10 個可能的標(biāo)簽豹芯,features 的維度應(yīng)該是 [None, n_input],labels 的維度是 [None, n_classes]驱敲。
# Features and Labels
features = tf.placeholder(tf.float32, [None, n_input])
labels = tf.placeholder(tf.float32, [None, n_classes])
None 維度在這里是一個 batch size 的占位符铁蹈。在運(yùn)行時,TensorFlow 會接收任何大于 0 的 batch size众眨。
batch的實(shí)現(xiàn)
import math
def batches(batch_size, features, labels):
"""
Create batches of features and labels
:param batch_size: The batch size
:param features: List of features
:param labels: List of labels
:return: Batches of (Features, Labels)
"""
assert len(features) == len(labels)
# TODO: Implement batching
output_batches = []
sample_size = len(features)
for start_i in range(0, sample_size, batch_size):
end_i = start_i + batch_size
batch = [features[start_i:end_i], labels[start_i:end_i]]
output_batches.append(batch)
return output_batches
Epochs(代)
一個代是指整個數(shù)據(jù)集正向握牧、反向訓(xùn)練一次。代在神經(jīng)網(wǎng)絡(luò)里是一個可調(diào)的超參數(shù)娩梨。
for epoch_i in range(epochs):
...
有了上面的基礎(chǔ)知識沿腰,就可以用TensorFlow搭建模型了,當(dāng)然狈定,需要的比如softmax颂龙,交叉熵等等函數(shù)TensorFlow里都封裝,具體用時查看API就行纽什。
問題回答
至此措嵌,TensorFlow上手完畢。
-
TensorFlow如何使用芦缰?套路是什么铅匹?
見上。簡單講除了所有數(shù)據(jù)封裝在tensor中饺藤,運(yùn)行在session中外沒什么特別的包斑。
以上內(nèi)容來自822實(shí)驗(yàn)室神經(jīng)網(wǎng)絡(luò)知識分享
我們的822,我們的青春
歡迎所有熱愛知識熱愛生活的朋友和822思享實(shí)驗(yàn)室一起成長涕俗,吃喝玩樂罗丰,享受知識。