(1)定義TensorFlow輸入節點
a.通過佔位符定義[常用]:具體使用tf.placeholder函數
x=tf.placeholder("float")
b.通過字典類型定義
inputdict={
'x'=tf.placeholder("float"),
'y'=tf.placeholder("float")
}
c.直接定義
train_x = np.float32(np.linspace(-1,1,100))
(2)定義“學習參數“的變量
a.直接定義:使用tf.Variable對參數直接定義
w=tf.Variable(tf.random_normal([1]),name="weight")
b=tf.Variable(tf.zeros([1]),name="bias")
b.字典定義 【參數過多,一般使用這種】
#模型參數
paradict={
'w':tf.Variable(tf.random_normal([1])),
'b'=tf.Variable(tf.zeros([1]))
}
#計算
z=tf.multiply(X,paradict['w'])+paradict['b']
(3)定義運算
a.正向傳播模型
b.定義損失函數:損失函數主要是計算”輸出值“與”目標值“之間的誤差,是配合反向傳播使用的
(4)優化函數
(5)初始化所有變量
init=tf.global_variables_initializer()
#使用這行代碼,必須再所有變量和OP定義完成後,才能保證定義的內容有效
#啓動Session
with tf.Session() as sess:
sess.run(init)
(6)迭代更新參數到最優解
在迭代訓練環節,都是需要建立一個session來完成的。在session中通過run來運行模型中的節點。
with tf.Session() as sess:
# 向模型輸入數據
for epoch in range(training_epochs):
for (x, y) in zip(train_X, train_Y):
sess.run(optimizer, feed_dict={X: x, Y: y})
(7)測試模型:評估模型的好壞
(8)使用模型
完整代碼:
mport tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
plotdata = { "batchsize":[], "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)]
#生成模擬數據
train_X = np.linspace(-1, 1, 100)
train_Y = 2 * train_X + np.random.randn(*train_X.shape) * 0.3 # y=2x,但是加入了噪聲
#顯示模擬數據點
plt.plot(train_X, train_Y, 'ro', label='Original data')
plt.legend()
plt.show()
# 創建模型
# 佔位符
X = tf.placeholder("float")#代表x的輸入
Y = tf.placeholder("float")#代表對應的真實值
# 模型參數
W = tf.Variable(tf.random_normal([1]), name="weight")#初始化爲[-1,1]的隨機數,形狀爲以維的數字
b = tf.Variable(tf.zeros([1]), name="bias")
# 前向結構
z = tf.multiply(X, W)+ b
#反向優化
'''將正向生成的值,觀察其與真實值的差距,再通過反向過程將裏面的參數進行調整,
接着再次正向生成預測值並與真實值進行對比,以此循環下去。'''
cost =tf.reduce_mean( tf.square(Y - z))#生成值與真實值的平方差
learning_rate = 0.01#學習速率,值越大,速度越快,但是越不精確,反之
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)
#訓練模型----迭代
# 初始化所所有變量
init = tf.global_variables_initializer()
# 定義參數
training_epochs = 20
display_step = 2
# 啓動session(Session創建好後,第一件事就是初始化)
with tf.Session() as sess:
sess.run(init)
# 向模型輸入數據
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["batchsize"].append(epoch)
plotdata["loss"].append(loss)
print (" Finished!")
print ("cost=", sess.run(cost, feed_dict={X: train_X, Y: train_Y}), "W=", sess.run(W), "b=", sess.run(b))
#print ("cost:",cost.eval({X: train_X, Y: train_Y}))
#圖形顯示
plt.plot(train_X, train_Y, 'ro', label='Original data')
plt.plot(train_X, sess.run(W) * train_X + sess.run(b), label='Fitted line')
plt.legend()
plt.show()
plotdata["avgloss"] = moving_average(plotdata["loss"])
plt.figure(1)
plt.subplot(211)
plt.plot(plotdata["batchsize"], plotdata["avgloss"], 'b--')
plt.xlabel('Minibatch number')
plt.ylabel('Loss')
plt.title('Minibatch run vs. Training loss')
plt.show()
print ("x=0.2,z=", sess.run(z, feed_dict={X: 0.2}))