1. 程式人生 > >使用tensorflow進行機器學習的一般流程

使用tensorflow進行機器學習的一般流程

使用tensorflow進行機器學習的一般流程

1.構建模型

構建模型是在實際進行一個專案之前要進行的工作,相當於設計,要針對使用者需求設計合適的預測模型和優化模型。

1.1構建預測模型

我們把機器學習運用到實際的工作中時,是期望機器可以具有一些人才有的智慧。簡單的說,輸入是一個集合,輸出也是一個集合,我們要建立輸入集合與輸出集合之間的關係模型,使系統接受到一個輸入之後,可以經過這個關係模型的計算,對映到輸出集合上的一個點。
而把輸入和輸出關聯起來的這個關係模型,就是我們要建立的預測模型。這個模型可以很簡單,比如,就是建立了

y=W*x+b

這樣一個線性模型,也可以是比較複雜的模型。比如我們常用的包含多個隱藏層的卷積神經網路模型,都是建立起了輸入與輸出之間的一個關係,讓我們接受到一個新的輸入時,可以根據輸入算出一個輸出。

1.2構建優化模型

構建出預測模型之後,其實這個模型什麼事也幹不了,他就是我們隨便寫的一個表示輸出與輸入關係的函式,但在初始情況下,他並不能很好的完成這個任務。下面我們要做的事情就是用正確的資料帶入這個函式,求出函式的引數,比如上面公式中的W和b。因為每一對正確的資料帶進去都會得到一個引數,那麼到底我們選擇哪一個呢,這就是我們要構建的優化模型,也就是我們常說的損失函式,用一種在數學上可計算的方式,去逼近我們理想中的那個引數。
比如:

cross_entropy = -tf.reduce_sum(y * tf.log(y_fc2))

這樣一個損失函式,函式的值cross_entropy 越小,就代表預測模型也好。那麼我們就把問題轉化為讓損失函式趨於最小值的問題。
這裡我們常用的方法是梯度下降法:
高等數學的理論告訴我們;
1)一個函式f(x,y)的對某個引數x的偏導數可以反應該函式在向量x附近的變化速度。
2)導函式的值為正代表函式遞增,為負代表函式遞減。
因此,這裡我們只要使用鏈式法則,用cross_entropy 對每一層的權重引數w求偏導數,就可以得到權重引數的變化率,然後再用該引數的當前值減去(學習速度*偏導數的值),就可以完成權重引數的微調(減去,表示使導函式為負)。
這就是優化模型的訓練原理,這裡我們只要設計得出這個損失函式就行了。

2.使用 TensorFlow 實現模型

TensorFlow的本意是張量流,就是通過使張量在圖中流動的方式來計算。模型的實現過程,就是構建這個圖的過程。構建圖包括三部分內容:

2.1通過佔位符將輸入引數與圖關聯起來

x = tf.placeholder("float", [None, 784])

2.2定義常量和變數,構建圖中的節點和邊

initial = tf.constant(0.1, shape = shape)
initial = tf.truncated_normal(shape = shape, stddev = 0.1, dtype = dtype, name = name)
    #tf.truncated_normal這個函式產生正太分佈,均值和標準差自己設定。
    # shape表示生成張量的維度,mean是均值,stddev是標準差。
tf.Variable(initial)

2.3定義函式,將上面的圖中的節點和邊關聯起來

hidden_conv1 = tf.nn.relu(conv2d(x_image, weight_conv1) + bias_conv1)
#tf.nn.relu()函式,啟用函式,是將大於0的數保持不變,小於0的數置為0
hidden_pool1 = max_pool_2x2(hidden_conv1)

# create tensorflow structure
cross_entropy = -tf.reduce_sum(y * tf.log(y_fc2))
optimize = tf.train.AdamOptimizer(0.0001)
train = optimize.minimize(cross_entropy)

3.使用 TensorFlow 訓練模型

訓練模型就是要使資料在上面構建的圖中跑起來。

3.1建立上下文session

session = tf.Session()

3.2初始化所有引數

init = tf.initialize_all_variables() 
session.run(init)

3.3用大量資料執行構建的模型

	for i in range(10000):
	    batch = mnist.train.next_batch(50)
	    session.run(train, feed_dict = {x:batch[0], y:batch[1], keep_prob:0.5})

4.使用 TensorFlow 進行實際預測

實際預測,其實和訓練一樣,就是使用實際資料在上面構建圖中的一次實際執行的過程,只是這次執行不需要反向傳播去優化權值向量。
實際預測的另一個重要的工作是對輸入引數進行預處理:
1)通過灰度化、去噪、切割等操作使輸入資料變成“好的”資料。
2)使用reshape對輸入資料進行形變,使其符合上面構建圖的要求。

以上是個人初學機器學習對tensorFlow的一些理解,有不對的地方歡迎討論交流。