手寫:邏輯迴歸擬合二維資料(tensorflow)
tensorflow開發的基本步驟
1、定義tensorflow輸入節點【3種方法】
2、定義學習引數的變數【2種方法】
3、定義運算
4、選擇優化函式,優化目標
5、初始化所有變數
6、迭代更新引數到最優解
7、測試模型
8、使用模型
下面就挑前幾個比較重要的說一下
1、定義tensorflow輸入節點【3種】
1.1使用 佔位符 定義:比較常用,使用 tf.placeholder 函式
佔位符的意思就是先定義,之後再解釋,就相當於先定義了變數但是沒有初始化,定義方法如下:
X = tf.placeholder("float")
Y = tf.placeholder("float")
1.2使用 字典型別 定義:用於輸入比較多的情況下
將佔位符與字典型別相結合,實現方法如下:
inputdict = { 'x':tf.placeholder("float"), 'y':tf.placeholder("float") }
1.3直接定義:一般很少用
就是將輸入的資料直接當做模型的輸入變數
2、定義學習引數的變數【2種】
2.1直接定義: 使用tf.Variable函式可以對引數直接定義
W = tf.Variable(tf.random_normal([1]),name = "weight")
b = tf.Variable(tf.zeros([1]),name = "bias")
2.2字典定義:在深層神經網路中,經常使用字典定義
就是將直接定義的方法加到字典型別中,實現方法如下:
paradict = {
'w':tf.Variable(tf.random_normal([1]),name = "weight"),
'b':tf.Variable(tf.zeros([1]),name = "bias")
}
#在前向計算的時候,使用方法
z = tf.multiply(X,paradict["w"]) + paradict["b"]
5、初始化所有變數
必須是要在所有的變數還有節點(OP)定義完成之後再進行全域性的變數初始化,不然,在初始化所有變數之後 定義的變數和OP都不能使用session中的run函式進行陣列計算了。
例項描述:
假設有一組資料集,其x和y的對應關係為y≈2x
需要讓神經網路學習這些樣本,並找到其中的規律。
實現深度學習的步驟
#1、準備資料
#2、搭建模型
#3、迭代訓練
#4、使用模型
下面的程式碼中實現了,訓練模型的儲存及過載、以及儲存檢查點
#深度學習
#1、準備資料
#2、搭建模型
#3、迭代訓練
#4、使用模型
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
#定義生成loss視覺化的函式
plotdata = {"batchrize":[],"loss":[]}
def moving_average(a,w=10):
if len(a)<w:
return a[:]
return[val if idx < w else sum(a[(idx-w):idx])/w for idx, val in enumerate(a)]
#1、準備資料
train_X = np.linspace(-1,1,100)
train_Y = 2 * train_X + np.random.rand(*train_X.shape)*0.3
#重置圖
tf.reset_default_graph()
#2、搭建模型
# X Y是佔位符,也就是說先定義了,之後再解釋,用placeholder函式進行定義
X = tf.placeholder("float") #代表輸入x的值
Y = tf.placeholder("float") #代表對應的真實值 y
#模型引數--變數
W = tf.Variable(tf.random_normal([1]),name = "weight") #tf.Variable 表示定義變數
b = tf.Variable(tf.zeros([1]),name = "bias")
#前向結構
#tf.multiply表示相乘的意思,也就是單個神經元的前向計算 權重x輸入+偏移
#z就是前向的計算輸出
z = tf.multiply(X,W) + b
#反向優化
#2.1、定義一個損失函式,此處使用的 生成值 與 真實值 之間的 平方差
cost = tf.reduce_mean(tf.square(Y-z))
#2.2、定義一個學習速率,代表調整引數的速度
learning_rate = 0.01
#2.3、使用梯度下降法進行 loss 函式的優化; GradientDescentOptimizer就是一個已經封裝好的 梯度下降的演算法
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)
#3、迭代訓練
#3.1 訓練模型
#初始化所有變數,必須在所有的變數和節點(OP)定義完成之後,再進行初始化
#否則,在初始化之後定義的變數和OP都無法使用session中的run來計算值
init = tf.global_variables_initializer()
#定義引數:迭代次數以及顯示步長
training_epochs = 30
display_step = 2
#生成saver
saver = tf.train.Saver()
savedir = "D:\work_work\spyder_working_space/"
#建立並啟動session, with語法可以在session結束後自行關閉,也是常用的session啟動方法
with tf.Session() as sess:
sess.run(init)
#向模型輸入資料,在單搭建模型的時候 使用X Y 兩個佔位符來表示的 模型中的 輸入 以及 輸出真實值
#因此需要將第一步中的資料 與 模型中的佔位符連結起來
#使用feed機制將真實資料灌到佔位符對應的位置
for epoch in range(training_epochs):
for (x,y) in zip(train_X,train_Y):
sess.run(optimizer,feed_dict={X:x,Y:y})
#顯示訓練中的詳細資訊
if epoch % display_step == 0:
loss = sess.run(cost,feed_dict={X:train_X,Y:train_Y})
print("Epoch:",epoch+1,"cost=",loss,"W=",sess.run(W),"b=",sess.run(b))
if not (loss == "NA"):
plotdata["batchrize"].append(epoch)
plotdata["loss"].append(loss)
#儲存訓練好的 模型變數,此操作只儲存 定義的變數
#也就是 tf.Variable 定義了的變數
saver.save(sess,savedir+"linermodel.cpkt",global_step=epoch)
print("Fineshed!")
print("cost=",sess.run(cost,feed_dict={X:train_X,Y:train_Y}),"W=",sess.run(W),"b=",sess.run(b))
#在顯示cost的時候可以使用下面的這種表示方法
#print("cost:",cost.eval({X:train_X,Y:train_Y}))
#3.2 模型視覺化
#為了更加直觀的表達,將生成的模型以及訓練的狀態值顯示出來
#圖形顯示
plt.plot(train_X,train_Y,'ro',label='Original data')
plt.plot(train_X,sess.run(W)*train_X + sess.run(b),label='Fittedline')
plt.legend()
plt.show()
plotdata["avgloss"] = moving_average(plotdata["loss"])
plt.figure(1)
plt.subplot(211)
plt.plot(plotdata["batchrize"],plotdata["avgloss"],'b--')
plt.xlabel("Minibatch number")
plt.ylabel("Loss")
plt.title("Minibatch run vs. Training loss")
plt.show()
#4、使用模型,啟動的時候 也需要啟動session
print("x=0.2,z=",sess.run(z,feed_dict={X:0.2}))
#重啟一個session,載入檢查點
load_epoch = 18
with tf.Session() as sess2:
sess2.run(tf.global_variables_initializer())
#載入之後就會覆蓋掉所有的引數
#因此,如果要載入模型的時候,不需要進行初始化了,因為就算是初始化也會被過載的覆蓋掉
saver.restore(sess2,savedir+"linermodel.cpkt-",str(load_epoch))
print("x=0.2,z=",sess2.run(z,feed_dict={X:0.2}))
輸出結果如下:
Epoch: 1 cost= 0.055053063 W= [1.6758726] b= [0.24198401]
Epoch: 3 cost= 0.011287085 W= [1.9341978] b= [0.1905865]
Epoch: 5 cost= 0.0077018575 W= [2.0061853] b= [0.16376488]
Epoch: 7 cost= 0.007581351 W= [2.0248852] b= [0.15660226]
Epoch: 9 cost= 0.0076055895 W= [2.0297222] b= [0.1547464]
Epoch: 11 cost= 0.007615575 W= [2.0309737] b= [0.15426627]
Epoch: 13 cost= 0.0076183914 W= [2.0312958] b= [0.15414251]
Epoch: 15 cost= 0.0076191537 W= [2.031381] b= [0.15410994]
Epoch: 17 cost= 0.007619343 W= [2.031402] b= [0.15410173]
Epoch: 19 cost= 0.0076193972 W= [2.031408] b= [0.15409955]
Epoch: 21 cost= 0.0076194014 W= [2.0314085] b= [0.15409915]
Epoch: 23 cost= 0.0076194014 W= [2.0314085] b= [0.15409914]
Epoch: 25 cost= 0.0076194014 W= [2.0314085] b= [0.15409914]
Epoch: 27 cost= 0.0076194014 W= [2.0314085] b= [0.15409914]
Epoch: 29 cost= 0.0076194014 W= [2.0314085] b= [0.15409914]
Fineshed!
cost= 0.0076194014 W= [2.0314085] b= [0.15409914]
x=0.2,z= [0.5603808]
INFO:tensorflow:Restoring parameters from D:\work_work\spyder_working_space/linermodel.cpkt
x=0.2,z= [0.5603808]