Tensorflow基本开发步骤——以逻辑回归拟合二维数据为例
深度學習大概有如下四個步驟:準備數據,搭建模型,迭代訓練和使用模型。
一、準備數據
使用y=2x作為主體,通過加入一些隨機干擾噪聲產生一組數據。代碼如下:
??? import tensorflow as tf
??? import numpy as np
??? import matplotlib.pyplot as plt
??? train_x=np.linspace(-1,1,100)
??? train_y=2*train_x+np.random.randn(100)*0.3
??? plt.plot(train_x,train_y,'go',label='Original data')
??? plt.legend()
??? plt.show()
生成的圖像為:
第三行的linspace函數原型為numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None),該函數的功能是在指定的范圍內按照固定的間隔生成數字,該間隔由設置的num自動切分,num默認值是50,可以自由設置但必須為非負。endpoint如果為真則產生的數字包括stop,否則不包括,該參數默認為True。如果retstep參數為真,則返回的結果還包括數字之間的間隔大小,該參數默認為False。dtpye設置輸出數組的類型,默認為None,根據其他輸入類型來判斷。
第四行的np.random.randn函數,生成隨機的標準正態分布的數值,如果參數為一個數,則生成該數目的隨機數,如果參數為兩個以上,則生成對應張量形狀的隨機數。
二、搭建模型
神經網絡在訓練的過程中需要通過正向生成一個預測值,觀察與真實值的的差距以后,通過一些算法反向調整原來設定的初始參數,然后再生成預測值。一直循環下去這個過程,直到將參數調整到合適的值為止。
創建正向模型的代碼段如下所示:
??? x=tf.placeholder('float')
??? y=tf.placeholder('float')
??? w=tf.Variable(tf.random_normal([1]),name='weight')
??? b=tf.Variable(tf.zeros([1]),name='bias')
??? z=tf.multiply(x,w)+b
后面要解釋占位符,變量和為什么要用tf的乘法而不能直接用乘法符號。
下面是反向優化代碼:
??? cost=tf.reduce_mean(tf.square(y-z))
??? learning_rate=0.05
??? optimizer=tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)
學習率代表著調整參數的速度,梯度下降算法以學習率作為參數。
三、迭代訓練模型
迭代訓練的代碼如下:
??? init=tf.global_variables_initializer()????? #初始化所有變量
??? training_epochs=100????? #迭代次數
??? display_step=4????? #顯示訓練結果的間隔
??? with tf.Session() as sess:???? #啟動Session
??????? sess.run(init)
??????? plotdata={'batchsize':[],'loss':[]}???? #構建兩個字典用以存放批次值和損失值
??????? for epoch in range(training_epochs):??? #向模型中輸入數據
??????????? for (x_data,y_data) in zip(train_x,train_y):??????? #在映射中取出映射對數據
??????????????? sess.run(optimizer,feed_dict={x:x_data,y:y_data})
??????????? if epoch % display_step == 0:
??????????????? loss=sess.run(cost,feed_dict={x:x_data,y:y_data})
??????????????? print('Epoch:',epoch+1,'cost:',loss,'w:',sess.run(w),'b:',sess.run(b))
??????????????? if not (loss == 'NA'):
??????????????????? plotdata['batchsize'].append(epoch)
??????????????????? plotdata['loss'].append(loss)
??????? print('finished')
??????? print('cost:',sess.run(cost,feed_dict={x:x_data,y:y_data}),'w:',sess.run(w),'b:',sess.run(b))
可以看出,在利用Tensorflow實現時,除了賦值定義參數意外,所有的計算操作都需要在Session中運行。第8行中的zip函數將可迭代的對象打包為元組組成的列表,實現一一對應的關系。第9行每運行一次優化算法,就會修改參數值w和b。第13行的判斷句是一個安全檢查,保證loss不出錯時才允許其輸出。運行結果如下圖所示:
四、使用模型
訓練好模型以后,往模型里面傳遞一個參數x即可,代碼如下:
??????? print('cost:',sess.run(cost,feed_dict={x:x_data,y:y_data}),'w:',sess.run(w),'b:',sess.run(b))
??????? print('x=0.2,z:',sess.run(z,feed_dict={x:0.2}))
得到結果為:
Tensorflow將中間節點間的運算關系(OPS)定義在自己內部的一個“圖”上,通過一個會話(Session)進行OPS中的具體運算。圖是靜態的,只是將關系搭建在一起,不會有任何計算發生。而會話是動態的,只有啟動會話,才能使得數據流入圖中,并按照圖中的關系運算,并將最終的運算結果從圖中流出。
Tensorflow開發的基本步驟是:(1)定義輸入節點;(2)定義“學習參數”變量;(3)定義“運算”;(4)優化函數,優化目標;(5)初始化所有變量;(6)迭代更新參數到最優解;(7)測試模型;(8)使用模型。
?定義節點和學習參數的方法一般通過占位符或者字典類型定義,字典類型用于輸入較多的情況。
??? inputdict={'x':tf.placeholder('float'),'y':tf.placeholder('float')}#輸入節點
??? paradict={'w':tf.Variable(tf.random_normal([1])),
?????????????????????????????? 'b':tf.Variable(tf.zeros([1]))}??????? #模型參數
定義“運算”的過程是建立模型的核心過程,直接決定了模型的擬合效果。定義運算主要包括定義正向傳播模型和定義損失函數。損失函數近幾年沒有太大的變化,只需要記住常見的幾種就可以,不需要掌握太多的細節,tensorflow已經做好了框架。
有了正向結構和損失函數后,就可以通過優化函數來優化學習參數了,這個過程是在反向傳播中完成的。反向傳播過程的技術會達到一定程度的瓶頸,更新不會像網絡結構那么快。
在session創建好以后,第一個要做的就是初始化。需要注意的是,在使用tf.global_variables_initializer函數初始化所有變量的步驟,一定要在定義這些變量和運算以后。
迭代更新參數到最優解。在迭代訓練環節,都是需要通過建立一個session來完成的,通常使用with語法,可以再session結束后自行關閉。run里面放置的是優化操作的運算,同時會在外層加上循環次數。
一般會把生成的模型保存起來,再通過載入已有的模型來進行實際的使用。
---------------------
原文:https://blog.csdn.net/not__only/article/details/81912632
總結
以上是生活随笔為你收集整理的Tensorflow基本开发步骤——以逻辑回归拟合二维数据为例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用TensorFlow的基本步骤
- 下一篇: Tensorflow实践 基本原理学习和