菜鳥學tensorflow.2

checkpoint

現在的你能手擼復現線性回歸網路。了解網路的創建,損失函數的設計、優化方法的選擇、Session的創建、數據的Feed和Fetch。

接下來的部分,需要使用框架實現卷積神經網路,做更複雜的Mnist手寫數字識別。

Outline

`知識掃盲

`繼續上篇,細節了解

`今日份實戰

`知識掃盲

進階的使用,需要對卷積神經網路有一定了解,大家可以去了解一下,推薦

吳恩達的機器學習課程,簡單了解機器學習的知識,起碼要知道什麼是線性回歸和邏輯回歸、什麼是梯度下降優化演算法

還是吳恩達的Unsupervised Feature Learning and Deep Learning,記得沉下心來慢慢看一下,還是挺有收穫的

zouxy的深度學習博客,通俗易懂

看完理論部分,然後上手擼tensorflow的代碼、看tensorflow的Doc即可掌握。這裡稍微講幾句。

卷積神經網路

網路有很多,不同網路在數據前向傳播的過程中有不同的操作而已,不要被專有名詞唬住。卷積神經網路創新點在於卷積層和池化層。

直接看這兩個層是如何實現的。

卷積層

卷積操作就是用卷積模板作為滑動窗和輸入做卷積操作,卷積操作說白了,就是元素對應相乘然後求和,相當於是加權求和。

運算中涉及操作術語:padding、stride。釋義可以看大牛做的動畫。

vdumoulin/conv_arithmetic

池化層

池化這個詞,中文其實沒有釋義的,直翻,pooling layer。一般採用max_pooling,mean_pooling,就是選擇一定區域的最大值或者所有元素的平均值作為這個區域的代表。池化層用於縮減網路規模。

卷積層使得網路的參數大為減少,池化層縮小了網路,兩者都是網路的訓練和運行提高了很大的效率。

`細節了解

先說一句,學習一個複雜的框架,通常需要迭代式的學習。

Tensor

回答以下問題:什麼是Tensor、如何創建、如何列印ta的值、計算

1、 It does not hold the values of that operations output, but instead provides a means of computing those values in a TensorFlow tf.Session.

tensor和operation構成了dataflow

2、 Tensor更多是由Op作為返回值使用。用戶常用的是創建常量Tensor -- tf.constant()

使用list or numpy的narray創建常量

q = tf.constant(1)

a = tf.constant([1,2,3])

b = tf.constant(np.array([2,2]))

如果需要創建定製的矩陣,使用numpy中的函數,rand、zeros等

3、 如何列印

因為我們在建立graph的時候,只建立tensor的結構形狀信息,並沒有執行數據的操作。所以直接列印tensor不會列印他的值,只有在session中,才能看到!可以看下面的代碼

import tensorflow as tfimport numpy as np# 創建numpy數組numpyData = np.array([[1,2],[2,4],[3,5]])# 創建tensortfData = tf.constant(numpyDate)print tfData# Tensor("Const_4:0", shape=(3, 2), dtype=int64)# 不會顯示值,即使這個tensor是一個常量sess = tf.InteractiveSession()tfData.eval()# print tfData.eval() 可以看到tensor返回的值sess.close()

4、張量之間的運算

張量、numpy的矩陣相互之間可以使用函數或者運算符進行運算

tf.add(a, b) 與 a + b二者的區別

在計算精度上,二者並沒有差別。運算符重載的形式a+b,會在內部轉換為,a.__add__(b),而a.__add__(b)會再一次地映射為tf.add

常見的math操作,tensorflow版本不同,函數名略有變化

tensorflow.org/api_guid

Session

InteractiveSession與Session

The only difference with a regular Session is that an InteractiveSession installs itself as the default session on construction. The methods tf.Tensor.eval and tf.Operation.run will use that session to run ops.

Tensor.eval()是執行這個tensor之前的所有操作。

`今日份實戰

說真的,代碼看懂了,自己寫一遍測試一遍,會掌握更多的細節

下面實現了簡單的線性回歸模型

細節:

numpy和tensor之間的轉化需要考慮類型

numpy行向量和矩陣相乘,需要使用 np.dot()

tf.matmul不能有向量參與,需要tf.reshape將向量轉化為矩陣

Variable參與的模型,需要在創建會話之後,先run初始化的部分

run(train)就是迭代了一次訓練過程,數據fetch還是使用run,並且可以獲取多個值

# implement simplest linear regressionimport tensorflow as tfimport numpy as np# define input and ground truthnumpyX = np.array(np.random.rand(2, 100),dtype=np.float32)wTruth = np.array([2.00,3.50])bTruth = np.array([4.60])# operands could not be broadcast together with shapes (2,) (2,100)# truth = wTruth*numpyX+bTruthtruth = np.dot(wTruth,numpyX)+bTruth# define the structure of networkw = tf.Variable([0.01, 0.02])b = tf.Variable(0.01)inputX = tf.constant(numpyX,dtype=tf.float32)# wrong vector multiple with matrix# outputY = w*inputX+bw = tf.reshape(w, [1,2])outputY = tf.matmul(w, inputX)+b# loss# although sum and mean have the same purpose, but sum will be inf# loss = tf.reduce_sum(tf.square(outputY-truth))loss = tf.reduce_mean(tf.square(outputY-truth))train = tf.train.GradientDescentOptimizer(0.01).minimize(loss)sess = tf.InteractiveSession()init = tf.initialize_all_variables()sess.run(init)for i1 in range(10000): sess.run(train) if i1 % 100 == 0: print sess.run([w, b, loss])sess.close()

下面實現了softmax回歸模型識別手寫數字,需要下載Mnist數據集

細節:

1、 關於下載數據集,使用github上提供的inputdata.py調用相關函數下載,還能隨機生成自定義數目的batch。方法:下載,放在同一文件夾,import input_data,mnist = input_data.read_data_sets(data/, one_hot=True),之後 batch = mnist.train.next_batch(50) 獲取batch

2、 注意類型轉換

accuracy = tf.reduce_mean(tf.cast(tf.equal(tf.argmax(output,1),tf.argmax(truth,1)),tf.float32))

3、運行訓練優化參數,可以使用sess.run,也可以train.run,並feed相應的data

4、事實可以存在多個網路結構,在運行會話時,哪些網路結構被激活,關鍵要看run中聲明要獲取的Tensor是什麼

# implement a simple network to recognize the hand-written numberimport tensorflow as tfimport input_data# input and ground truthinput = tf.placeholder(tf.float32, shape=[None, 784])truth = tf.placeholder(tf.float32, shape=[None, 10])# establish networkw = tf.Variable(tf.zeros([784, 10]))b = tf.Variable(tf.zeros([10]))output = tf.nn.softmax(tf.matmul(input, w)+b)# losscross_entropy = -tf.reduce_sum(truth*tf.log(output))# how to traintrain = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)# test to evaluate# accuracy = tf.reduce_mean(tf.equal(tf.argmax(output,1),tf.argmax(truth,1)))accuracy = tf.reduce_mean(tf.cast(tf.equal(tf.argmax(output,1),tf.argmax(truth,1)),tf.float32))mnist = input_data.read_data_sets(data/, one_hot=True)init = tf.initialize_all_variables()sess = tf.InteractiveSession()sess.run(init)for i1 in range(1000): # get input batches batch = mnist.train.next_batch(50) sess.run(train,feed_dict={input: batch[0], truth: batch[1]}) # train.run(feed_dict={input: batch[0], truth: batch[1]}) if i1%100 == 0: print sess.run(accuracy,feed_dict={input: batch[0], truth: batch[1]})sess.close()

程序的部分輸出

0.32

0.94

0.9

0.94

0.98

下一篇實戰如何用卷積神經網路來做手寫數字的識別,如何安裝使用GPU版本的tensorflow

推薦閱讀:

28 款 GitHub 最流行的開源機器學習項目(附地址)
TF里幾種loss和注意事項
Google I/O 2017 上有哪些關於 TensorFlow 的前沿應用和分享?
使用TensorFlow時輸入數據的三個姿勢
Sublime Text3搭建Tensorflow環境

TAG:TensorFlow | 機器學習 |