導(dǎo)讀:本文第一部分會介紹tensorflow基本的一些概念,流程圖,占位符,模型的持久化等;第二部分會結(jié)合具體的案例來進(jìn)行對上述的概念進(jìn)行綜合的理解和教程
part1:
tensorflow初識
tensorflow=tensor(張量,也可以理解為多維數(shù)組)+flow(流)
1.1計(jì)算圖的概念
tensorflow的程序執(zhí)行通常會分為兩個(gè)階段:
第一階段定義變量和變量之間的運(yùn)算關(guān)系
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í)行計(jì)算
sess =tf.Session()
sess.run(c)
計(jì)算圖可以抽象理解為畫板,不特殊指定的話會在默認(rèn)的畫板上畫畫,不同畫板上的圖案不會共享
import tensorflow as tf
g1=tf.Graph() #生成畫板1
with g1.as_default():
#定義變量,設(shè)置初始值為0
v=tf.get_variable("v",shape=[1],initializer=tf.zeros_initializer) #定義了一只貓的繪制方法
g2=tf.Graph() #生成畫板1
with g2.as_default():
#定義變量,設(shè)置初始值為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()#初始化所有變量,并運(yùn)行(開始畫畫)
with tf.variable_scope(" ",reuse=True):
#獲得畫板上的內(nèi)容
print(sess.run(tf.get_variable("v"))) #看到一只貓
with tf.Session(graph=g2) as sess: #打開畫板2
tf.global_variables_initializer().run()#初始化所有變量,并運(yùn)行(開始畫畫)
with tf.variable_scope(" ",reuse=True):
#獲得畫板上的內(nèi)容
print(sess.run(tf.get_variable("v"))) #看到一只狗
1.2張量
張量可以理解為n維度數(shù)組(臨摹的時(shí)候畫筆的粗細(xì)),主要用來對中間結(jié)果的引用和獲得計(jì)算的結(jié)果
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é)點(diǎn)的處理步驟
print(c)
#Tensor("add:0",shape(2,),dtype=float32) #這時(shí)候并沒有進(jìn)行計(jì)算
#一個(gè)張量有三個(gè)屬性
(1)名字屬性 "add:0" -畫筆的名稱
(2)維度屬性“shape(2,)” -畫筆的粗細(xì)
(3)類型屬性 dtype=float32 --畫筆的顏料,不同成分的顏料不能混用
1.3會話session
會話執(zhí)行的主要是Tensorflow的第二個(gè)階段,根據(jù)定義好的流程進(jìn)行計(jì)算
調(diào)用session有兩種方法,類似正常讀取文件的方法
method 1:
#創(chuàng)建會話
sess=tf.Session()
#執(zhí)行定義好的計(jì)算
sess.run()
#關(guān)閉會話,釋放資源
sess.close()
method 2: 常用自動(dòng)釋放資源
with tf.Session() as sess:
sess.run(……)
完整的通過會話計(jì)算張量
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: #運(yùn)行會話得到c的計(jì)算結(jié)果[3.0,5,0]
print(c.eval())
#with tf.Session() as sess: 只是進(jìn)行運(yùn)算并不會顯示
# sess.run(c)
#with tf.Session() as sess: #計(jì)算并打印結(jié)果
# print(sess.run(c))
1.4神經(jīng)網(wǎng)路參數(shù)和變量
神經(jīng)網(wǎng)路參數(shù)是實(shí)現(xiàn)神經(jīng)網(wǎng)路的重要部分,在tensorflow中就是用變量來更新和保存神經(jīng)網(wǎng)路中的參數(shù),使用變量的時(shí)候要給變量指定初始值
#生成初始值為隨機(jī)正態(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中,定義變量只是定義了變量的生成過程,變量并沒有被賦值,需要通過初始化來對變量進(jìn)行真正的賦值
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
#當(dāng)變量過多時(shí)候可以用下面的方式替換
#init_op=tf.global_variables_initializer() #獲得所有變量
###tf.global_variables() #獲得存在的所有變量
#sess.run(init_op)
print(sess.run(y))
我們提到了張量和變量,張量是一種存放數(shù)據(jù)的結(jié)構(gòu),變量的輸出結(jié)果就是張量,可以理解為變量是一種特殊的張量;與張量一樣變量也有三個(gè)屬性
名字,維度,類型,其中維度可以進(jìn)行修改(通常不會修改),類型一旦指定就不能修改(默認(rèn)為tf.flaot64)
import tensorflow as tf
w1=tf.Variable(tf.random_normal([2,3],stddev=2,seed=1),name='w1')
#數(shù)據(jù)類型錯(cuò)誤
w2=tf.Variable(tf.random_normal([2,3],stddev=2,seed=1),dtype=tf.float64,name='w2')
w1.assign(w2) #只是定義關(guān)系并沒有執(zhí)行
#維度錯(cuò)誤
w2=tf.Variable(tf.random_normal([2,2],stddev=2,seed=1),name='w2')
tf.assign(w1,w2) #會報(bào)維度不匹配的錯(cuò)誤
tf.assign(w1,w2,validate_shape=False) #允許更改維度,會被正常執(zhí)行
part2:
神經(jīng)網(wǎng)絡(luò)訓(xùn)練過程和簡單實(shí)現(xiàn)
2.1神經(jīng)網(wǎng)絡(luò)算法示意圖

2.2一些新的名詞
batch_size:由于神經(jīng)網(wǎng)絡(luò)一次訓(xùn)練是選取部分?jǐn)?shù)據(jù)進(jìn)行訓(xùn)練的,需要指定這部分?jǐn)?shù)據(jù)的大?。ㄒ淮斡?xùn)練多少行的數(shù)據(jù))
數(shù)據(jù)量小的時(shí)候是可以一次性使用全部數(shù)據(jù),數(shù)據(jù)量大的時(shí)候這樣會造成內(nèi)存溢出
steps or train_steps:表示訓(xùn)練輪數(shù)
tf.placeholder() #定義輸入數(shù)據(jù)的格式,類似函數(shù)的形參
learning_rate #學(xué)習(xí)率
2.3定義完整神經(jīng)網(wǎng)絡(luò)參數(shù)
神經(jīng)網(wǎng)絡(luò)的訓(xùn)練大致分為下面三個(gè)步驟
1.定義神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)和前項(xiàng)傳播算法的輸出結(jié)果
2.定義損失函數(shù)和選擇反向傳播算法
3.定義會話,并在訓(xùn)練數(shù)據(jù)上不斷優(yōu)化反向傳播算法
import tensorflow as tf
from numpy.random import RandomState
import matplotlib.pyplot as plt
#定義訓(xùn)練數(shù)據(jù)的大小
batch_size=8
#定義神經(jīng)網(wǎng)絡(luò)參數(shù)
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')
#定義神經(jīng)網(wǎng)絡(luò)接收參數(shù)的格式
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)
#定義損失函數(shù)和反向傳播算法
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))) #分類算法常用的損失函數(shù)
#反向傳播算法
train_step=tf.train.AdamOptimizer(0.001).minimize(cross_entropy)
#生成自定義數(shù)據(jù)集大大小
rdm=RandomState(1)
dateset_size=128
X=rdm.rand(dateset_size,2) #生成128行兩列矩陣
y=[[int(x1+x2)] for (x1,x2) in X] #數(shù)據(jù)示意見下圖
with tf.Session() as sess:
#初始化并運(yùn)行所有變量
init_op=tf.global_variables_initializer()
sess.run(init_op)
#設(shè)定訓(xùn)練輪數(shù)
STEPS=5000
for i in range(STEPS):
start =(i*batch_size)%dataset_size
end=min(start+batch_size,dataset_size)
#輸入?yún)?shù),執(zhí)行訓(xùn)練流程
sess.run(train_step,feed_dict=feed_dict{x:X[start:end],y_:Y[start:end]})
#每隔一段時(shí)間,計(jì)算所有數(shù)據(jù)的交叉熵
if i%1000==0:
total_cross_entropy=sess.run(cross_entropy,feed_dict={x:X,y_:Y})
print("經(jīng)過%s次訓(xùn)練現(xiàn)在的誤差是%"%(i,total_cross_entropy))
