tensorflow學習筆記(2)-反向傳播
阿新 • • 發佈:2018-05-27
die AD col 更新 min with SQ 矩陣 glob
tensorflow學習筆記(2)-反向傳播
反向傳播是為了訓練模型參數,在所有參數上使用梯度下降,讓NN模型在的損失函數最小
損失函數:學過機器學習logistic回歸都知道損失函數-就是預測值和真實值得差距,比如sigmod或者cross-entropy
均方誤差:tf.reduce_mean(tf.square(y-y_))很好理解,假如在歐式空間只有兩個點的的話就是兩點間距離的平方,多點就是多點誤差的平方和除以對比點個數
學習率:決定了參數每次更新的幅度
反向傳播訓練方法:為了減小loss的值為優化目標
# -*- coding: utf-8 -*-
"""
Created on Sat May 26 18:42:08 2018
@author: Administrator
"""
import tensorflow as tf
import numpy as np
BATCH_SIZE=8
seed=23455
#基於seed產生隨機數
rng=np.random.RandomState(seed)
#隨機返回32行2列的矩陣 作為數據集輸入
X=rng.rand(32,2)
#從X這個32行2列的矩陣中取出一行 判斷如果和小於1 給Y賦值1 如果和不小於1 給Y賦值0
#Y作為訓練集的標簽
Y=[[int((x0+x1)<1)] for (x0,x1) in X]
print(X)
print(Y)
#定義輸入,參數和輸出
x=tf.placeholder(tf.float32,shape=(None,2))
y_=tf.placeholder(tf.float32,shape=(None,1))
#2是特征值 3是隱藏層 1是輸出
w1=tf.Variable(tf.random_normal([2,3],stddev=1,seed=1))
w2=tf.Variable(tf.random_normal([3,1],stddev=1,seed=1))
a=tf.matmul(x,w1)
y=tf.matmul(a,w2)
#定義損失函數以及反向傳播方法
loss=tf.reduce_mean(tf.square(y-y_))
train_step=tf.train.GradientDescentOptimizer(0.001).minimize(loss)
#會話訓練
with tf.Session() as sess:
init_op=tf.global_variables_initializer()
sess.run(init_op)
#輸出未訓練的參數值
print(sess.run(w1))
print(sess.run(w2))
#訓練3000次
STEPS=10000
for i in range(STEPS):
start=(i*BATCH_SIZE)%32
end=BATCH_SIZE+start
#每次訓練抽取start到end的數據
sess.run(train_step,feed_dict={x:X[start:end],y_:Y[start:end]})
#每500次打印一次參數
if i%500==0:
total_loss=sess.run(loss,feed_dict={x:X,y_:Y})
print("在第%d次訓練,損失為%g"%(i,total_loss))
#輸出訓練後的參數
print("\n")
print(sess.run(w1))
print(sess.run(w2))
這是輸出的內容
我們現在稍微改下參數比較下,首先是學習速率
當學習速率為0.1時候 當學習速率為0.01
可以看出來學習速率越大梯度下降越塊。
再來看看隱藏層
首先是隱藏層為4時候 隱藏層為3時候
現在還不知道隱藏層怎麽定義,知道以後再補上
問了群裏老哥:老哥回答
tensorflow學習筆記(2)-反向傳播