天天看點

DL架構之Tensorflow:深度學習架構Tensorflow的簡介、安裝、使用方法之詳細攻略(三)

2、相關概念

1、張量(tensor)

    TensorFlow 中的核心資料機關是張量(tensor)。一個張量由一組形成陣列(任意維數)的原始值組成。張量的階(rank)是它的維數,而它的形狀(shape)是一個整數元組,指定了陣列每個次元的長度。以下是張量值的一些示例:

3.    # a rank 0 tensor; a scalar with shape [],

[1., 2., 3.] # a rank 1 tensor; a vector with shape [3]

[[1., 2., 3.], [4., 5., 6.]] # a rank 2 tensor; a matrix with shape [2, 3]

[[[1., 2., 3.]], [[7., 8., 9.]]] # a rank 3 tensor with shape [2, 1, 3]

     TensorFlow 使用numpy數組來表示張量值。

     tf.Tensor 具有以下屬性:

資料類型(例如float32、int32 或string)

形狀

     張量中的每個元素都具有相同的資料類型,且該資料類型一定是已知的。形狀,即張量的維數和每個次元的大小,可能隻有部分已知。如果其輸入的形狀也完全已知,則大多數操作會生成形狀完全已知的張量,但在某些情況下,隻能在執行圖時獲得張量的形狀。

(1)、階(rank)和形狀(shape)

     tf.Tensor 對象的階是它本身的維數。階的同義詞包括:秩、等級或n 維。請注意,TensorFlow 中的階與數學中矩陣的階并不是同一個概念。如下表所示,TensorFlow 中的每個階都對應一個不同的數學執行個體:

    張量的形狀是每個次元中元素的數量。TensorFlow 在圖的建構過程中自動推理形狀。這些推理的形狀可能具有已知或未知的階。如果階已知,則每個次元的大小可能已知或未知。TensorFlow 檔案編制中通過三種符号約定來描述張量次元:階,形狀和維數。下表闡述了三者如何互相關聯:

DL架構之Tensorflow:深度學習架構Tensorflow的簡介、安裝、使用方法之詳細攻略(三)
DL架構之Tensorflow:深度學習架構Tensorflow的簡介、安裝、使用方法之詳細攻略(三)
DL架構之Tensorflow:深度學習架構Tensorflow的簡介、安裝、使用方法之詳細攻略(三)

TensorFlow的使用方法

TF學習:Tensorflow基礎案例、經典案例集合——基于python程式設計代碼的實作

1、基礎函數

sess.run()  

#當我們建構完圖後,需要在一個會話中啟動圖,啟動的第一步是建立一個Session對象。  為了取回(Fetch)操作的輸出内容, 可以在使用 Session 對象的 run()調用執行圖時,傳入一些 tensor, 這些 tensor 會幫助你取回結果。那麼調用sess.run()的時候,ensorflow并沒有計算整個圖,隻是計算了與想要fetch 的值相關的部分。

占位符和 feed_dict  :占位符并沒有初始值,它隻會配置設定必要的記憶體。在會話中,占位符可以使用 feed_dict 饋送資料。  feed_dict 是一個字典,在字典中需要給出每一個用到的占位符的取值。在訓練神經網絡時需要每次提供一個批量的訓練樣本,如果每次疊代選取的資料要通過常量表示,那麼 TensorFlow 的計算圖會非常大。因為每增加一個常量,TensorFlow 都會在計算圖中增加一個結點。是以說擁有幾百萬次疊代的神經網絡會擁有極其龐大的計算圖,而占位符卻可以解決這一點,它隻會擁有占位符這一個結點。

2、輸出tensorflow的版本号

import tensorflow as tf

print('輸出tensorflow的版本:',tf.__version__)

案例應用

DL架構之Tensorflow:Tensorflow中常用函數的簡介、使用方法之詳細攻略

1、使用常量和占位符進行計算

#使用常量和占位符進行計算:其中 y_1 的計算過程使用占位符,而 y_2 的計算過程使用常量

w1=tf. Variable (tf.random_normal([ 1 , 2 ],stddev= 1 ,seed= 1 ))  #因為需要重複輸入x,而每建一個x就會生成一個結點,計算圖的效率會低。是以使用占位符

x=tf.placeholder(tf.float32,shape=( 1 , 2 ))

x1=tf.constant([[ 0.7 , 0.9 ]])

a=x+w1

b=x1+w1

sess=tf. Session ()

sess.run(tf.global_variables_initializer())  #運作y時将占位符填上,feed_dict為字典,變量名不可變

y_1=sess.run(a,feed_dict={x:[[ 0.7 , 0.9 ]]})

y_2=sess.run(b)

print (y_1)

print (y_2)

sess.close

2、輸出w、b和計算兩個數值相乘

import numpy as np

W = tf.Variable(np.arange(6).reshape((2, 3)), dtype=tf.float32, name="weights")

b = tf.Variable(np.arange(3).reshape((1, 3)), dtype=tf.float32, name="biases")

saver = tf.train.Saver()

with tf.Session() as sess:

   saver.restore(sess, "niu/save_net.ckpt")

   print("weights:", sess.run(W))

   print("biases:", sess.run(b))

#建構一個計算圖

a=tf.constant([1.0, 2.0])

b=tf.constant([3.0, 4.0])

c=a*b  

#T1、傳統的方法,先建構再釋放

sess=tf.Session()   #建構一個Session

print(sess.run(c))  #把計算圖放到session裡,并運作得到結果

sess.close()        #關閉session釋放資源

#T2、with語句的方法,先建構再釋放

with tf.Session() as sess:

   print(sess.run(c))  #把計算圖放到session裡,并運作得到結果

3、ML之LoR:利用LoR算法(tensorflow)對mnist資料集實作手寫數字識别

from tensorflow.examples.tutorials.mnist import input_data

#1、定義資料集:mnist

mnist = input_data.read_data_sets('MNIST_data', one_hot=True)

trainimg       =  mnist.train.images

trainimg_label =  mnist.train.labels

testimg        =  mnist.test.images

testimg_label  =  mnist.test.labels

print(trainimg_label[0]) #輸出第一行label值

#2、定義x、y、w、b:tf.placeholder占位符、tf.Variable變量

x = tf.placeholder("float",[None,784])  # [None,784]樣本的個數(無限大),每個樣本的特征(784個像素點)

y = tf.placeholder("float",[None,10])   #樣本的類别(10個)

W = tf.Variable(tf.zeros([784,10]))     #每個特征(784個像素點)對應輸出10個分類值

b = tf.Variable(tf.zeros([10]))

#3、模型預測:LoR(softmax多分類)

#3.1、定義計算損失:actv、cost

actv = tf.nn.softmax(tf.matmul(x,W)+b)                                     #計算屬于正确類别的機率值

cost = tf.reduce_mean(-tf.reduce_sum(y*tf.log(actv),reduction_indices=1))  #計算損失值(預測值與真實值間的均方差)

#3.2、定義模型訓練:learning_rate、optm:

#(1)、采用GD優化參數w、b,最小化損失值

learning_rate=0.01                    

optm = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost) #學習率為0.01

# optimizer = tf.train.GradientDescentOptimizer(0.01)                    #學習率為0.01

# optm = optimizer.minimize(cost)                                        #最小化損失值

#3.3、定義模型的pred、accr

pred =    tf.equal(tf.argmax(actv,1),tf.argmax(y,1))  #預測值:equal傳回的值是布爾類型,argmax傳回矩陣中最大元素的索引,0,代表列方向;1代表行方向        

accr =    tf.reduce_mean(tf.cast(pred,"float"))       #準确率,cast進行類型轉化 (true為1,false為0)                

#3.4、定義模型訓練參數init_op、train_epochs、batch_size、display_step

init_op = tf.global_variables_initializer()       #初始化所有variables 的op

train_epochs = 50   #将所有樣本疊代50次

batch_size = 100       #每次疊代選擇樣本的個數                

display_step =5        #每進行5個epoch進行一次展示              

#3.5、運作模型tf.Session()

with tf.Session() as sess:             #在session中啟動graph

   sess.run(init_op)                      #啟動運作使用variables的op

   for epoch in range(train_epochs):

       #(1)、定義avg_cost、num_batch

       avg_cost =0.0  #初始化損失值

       num_batch = int(mnist.train.num_examples/batch_size)

       #(2)、for循環實作num_batch批量訓練

       for i in range(num_batch):

           batch_xs, batch_ys = mnist.train.next_batch(batch_size)  #以batch為機關逐次進行

           sess.run(optm,feed_dict={x: batch_xs,y: batch_ys})       #給x,y指派

           feeds={x: batch_xs,y: batch_ys}  

           avg_cost +=sess.run(cost,feed_dict= feeds)/num_batch

      #(3)、if判斷實作每輪結果輸出:輸出每輪(5個epoch)的cost、trian_acc、test_acc

       if epoch %  display_step == 0:

           feeds_train = {x: batch_xs,y: batch_ys}        

           feeds_test  = {x:mnist.test.images,y: mnist.test.labels}

           train_acc   =  sess.run(accr,feed_dict= feeds_train)

           test_acc    =  sess.run(accr,feed_dict= feeds_test)        

           print("Epoch: %03d/%03d cost:%.9f trian_acc: %.3f test_acc: %.3f"

                % (epoch,train_epochs,avg_cost,train_acc,test_acc))        

print("Done")