導讀:本文第一部分會介紹tensorflow基本的一些概念殖演,流程圖,占位符年鸳,模型的持久化等趴久;第二部分會結合具體的案例來進行對上述的概念進行綜合的理解和教程
part1:
tensorflow初識
tensorflow=tensor(張量,也可以理解為多維數組)+flow(流)
1.1計算圖的概念
tensorflow的程序執(zhí)行通常會分為兩個階段:
第一階段定義變量和變量之間的運算關系
import tensorflow as tf
a=tf.constant([1.0,2.0],name="a") #定義常量
b=tf.constant([2.0,4.0],name="b")
c=a+b
第二階段執(zhí)行計算
sess =tf.Session()
sess.run(c)
計算圖可以抽象理解為畫板搔确,不特殊指定的話會在默認的畫板上畫畫彼棍,不同畫板上的圖案不會共享
import tensorflow as tf
g1=tf.Graph() #生成畫板1
with g1.as_default():
#定義變量,設置初始值為0
v=tf.get_variable("v",shape=[1],initializer=tf.zeros_initializer) #定義了一只貓的繪制方法
g2=tf.Graph() #生成畫板1
with g2.as_default():
#定義變量,設置初始值為1
v=tf.get_variable("v",shape=[1],initializer=tf.ones_initializer) #定義了一只狗的會話方法
with tf.Session(graph=g1) as sess: #打開畫板1
tf.global_variables_initializer().run()#初始化所有變量,并運行(開始畫畫)
with tf.variable_scope(" ",reuse=True):
#獲得畫板上的內容
print(sess.run(tf.get_variable("v"))) #看到一只貓
with tf.Session(graph=g2) as sess: #打開畫板2
tf.global_variables_initializer().run()#初始化所有變量,并運行(開始畫畫)
with tf.variable_scope(" ",reuse=True):
#獲得畫板上的內容
print(sess.run(tf.get_variable("v"))) #看到一只狗
1.2張量
張量可以理解為n維度數組(臨摹的時候畫筆的粗細),主要用來對中間結果的引用和獲得計算的結果
import tensorflow as tf
a=tf.constant([1.0,2.0],name="a") #定義常量
b=tf.constant([2.0,3.0],name="b")
c=tf.add(a,b,name="add") #定義c節(jié)點的處理步驟
print(c)
#Tensor("add:0",shape(2,),dtype=float32) #這時候并沒有進行計算
#一個張量有三個屬性
(1)名字屬性 "add:0" -畫筆的名稱
(2)維度屬性“shape(2,)” -畫筆的粗細
(3)類型屬性 dtype=float32 --畫筆的顏料膳算,不同成分的顏料不能混用
1.3會話session
會話執(zhí)行的主要是Tensorflow的第二個階段滥酥,根據定義好的流程進行計算
調用session有兩種方法,類似正常讀取文件的方法
method 1:
#創(chuàng)建會話
sess=tf.Session()
#執(zhí)行定義好的計算
sess.run()
#關閉會話畦幢,釋放資源
sess.close()
method 2: 常用自動釋放資源
with tf.Session() as sess:
sess.run(……)
完整的通過會話計算張量
import tensorflow as tf
a=tf.constant([1.0,2.0],name="a") #定義常量
b=tf.constant([2.0,3.0],name="b")
c=a+b
with tf.Session() as sess: #運行會話得到c的計算結果[3.0,5,0]
print(c.eval())
#with tf.Session() as sess: 只是進行運算并不會顯示
# sess.run(c)
#with tf.Session() as sess: #計算并打印結果
# print(sess.run(c))
1.4神經網路參數和變量
神經網路參數是實現神經網路的重要部分,在tensorflow中就是用變量來更新和保存神經網路中的參數缆蝉,使用變量的時候要給變量指定初始值
#生成初始值為隨機正態(tài)分布的變量
weights=tf.Variable(tf.random_normal([2,3],stddev=2))
#生成初始值為0的變量
biases=tf.Variable(tf.zeros([3]))
#通過其他變量的初始值來定義變量
w2=tf.Variable(weights.initialized_value()) #生成初始值跟weights一樣的變量
w2=tf.Variable(weights.initialized_value()*2)
在tensorflow中宇葱,定義變量只是定義了變量的生成過程祝旷,變量并沒有被賦值毅厚,需要通過初始化來對變量進行真正的賦值
import tensorflow as tf
w1=tf.Variable(tf.random_normal([2,3],stddev=2,seed=1))
w2=tf.Variable(tf.random_normal([3,1],stddev=2,seed=1))
x=tf.constant([[0.7,0.9]])
a=tf.matmul(x,w1)
y=tf.matmul(a,w2)
with tf.Session() as sess:
sess.run(w1.initializer) #初始化w1
sess.run(w2.initializer) #初始化w2
#當變量過多時候可以用下面的方式替換
#init_op=tf.global_variables_initializer() #獲得所有變量
###tf.global_variables() #獲得存在的所有變量
#sess.run(init_op)
print(sess.run(y))
我們提到了張量和變量胶果,張量是一種存放數據的結構撞秋,變量的輸出結果就是張量怒见,可以理解為變量是一種特殊的張量;與張量一樣變量也有三個屬性
名字盯拱,維度事甜,類型订歪,其中維度可以進行修改(通常不會修改)穿肄,類型一旦指定就不能修改(默認為tf.flaot64)
import tensorflow as tf
w1=tf.Variable(tf.random_normal([2,3],stddev=2,seed=1),name='w1')
#數據類型錯誤
w2=tf.Variable(tf.random_normal([2,3],stddev=2,seed=1),dtype=tf.float64,name='w2')
w1.assign(w2) #只是定義關系并沒有執(zhí)行
#維度錯誤
w2=tf.Variable(tf.random_normal([2,2],stddev=2,seed=1),name='w2')
tf.assign(w1,w2) #會報維度不匹配的錯誤
tf.assign(w1,w2,validate_shape=False) #允許更改維度年局,會被正常執(zhí)行
part2:
神經網絡訓練過程和簡單實現
2.1神經網絡算法示意圖
2.2一些新的名詞
batch_size:由于神經網絡一次訓練是選取部分數據進行訓練的际看,需要指定這部分數據的大小(一次訓練多少行的數據)
數據量小的時候是可以一次性使用全部數據矢否,數據量大的時候這樣會造成內存溢出
steps or train_steps:表示訓練輪數
tf.placeholder() #定義輸入數據的格式仲闽,類似函數的形參
learning_rate #學習率
2.3定義完整神經網絡參數
神經網絡的訓練大致分為下面三個步驟
1.定義神經網絡的結構和前項傳播算法的輸出結果
2.定義損失函數和選擇反向傳播算法
3.定義會話,并在訓練數據上不斷優(yōu)化反向傳播算法
import tensorflow as tf
from numpy.random import RandomState
import matplotlib.pyplot as plt
#定義訓練數據的大小
batch_size=8
#定義神經網絡參數
w1=tf.Variable(tf.random_normal([2,3],stddev=2,seed=1),name='w1')
w1=tf.Variable(tf.random_normal([3,1],stddev=2,seed=1),name='w2')
#定義神經網絡接收參數的格式
x=tf.placeholder(tf.float32,shape=(None,2),name='x-input') #定義輸入形參僵朗,兩列
y_=tf.placeholder(tf.float32,shape=(None,1),name='y-input') #定義輸出形參赖欣,一列
#定義向前傳播的算法過程
a=tf.matmul(x,w1)
y=tf.matmul(y,w2)
y=tf.sigmod(y)
#定義損失函數和反向傳播算法
cross_entropy=-tf.reduce_mean(y_*tf.log(tf.clip_by_value(y,1e-10,1.0))+(1-y_)*tf.log(tf.clip_by_value(1-y,1e-10,1.0))) #分類算法常用的損失函數
#反向傳播算法
train_step=tf.train.AdamOptimizer(0.001).minimize(cross_entropy)
#生成自定義數據集大大小
rdm=RandomState(1)
dateset_size=128
X=rdm.rand(dateset_size,2) #生成128行兩列矩陣
y=[[int(x1+x2)] for (x1,x2) in X] #數據示意見下圖
with tf.Session() as sess:
#初始化并運行所有變量
init_op=tf.global_variables_initializer()
sess.run(init_op)
#設定訓練輪數
STEPS=5000
for i in range(STEPS):
start =(i*batch_size)%dataset_size
end=min(start+batch_size,dataset_size)
#輸入參數,執(zhí)行訓練流程
sess.run(train_step,feed_dict=feed_dict{x:X[start:end],y_:Y[start:end]})
#每隔一段時間验庙,計算所有數據的交叉熵
if i%1000==0:
total_cross_entropy=sess.run(cross_entropy,feed_dict={x:X,y_:Y})
print("經過%s次訓練現在的誤差是%"%(i,total_cross_entropy))