Tensorflow簡明教程(一)

導(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ò)算法示意圖

神經(jīng)網(wǎng)絡(luò)反向傳播優(yōu)化.png

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))
生成數(shù)據(jù)示意圖.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 關(guān)于 TensorFlow TensorFlow? 是一個(gè)采用數(shù)據(jù)流圖(data flow graphs),用于數(shù)...
    Bobby0322閱讀 77,946評論 2 55
  • (第一部分 機(jī)器學(xué)習(xí)基礎(chǔ))第01章 機(jī)器學(xué)習(xí)概覽第02章 一個(gè)完整的機(jī)器學(xué)習(xí)項(xiàng)目(上)第02章 一個(gè)完整的機(jī)器學(xué)習(xí)...
    SeanCheney閱讀 8,548評論 3 43
  • 家里只要有個(gè)還在上學(xué)的孩子,你的生活作息和所有的活動(dòng)安排就必須以孩子為中軸線來進(jìn)行。每天過的就像打仗一樣,緊張忙碌...
    竹林吉祥老爸閱讀 414評論 0 2
  • 晶瑩剔透的雪花為城堡穿上潔白紗裙,來方特賞白雪紛飛,圓你一個(gè)夢幻童話夢!想穿越到《熊出沒之雪嶺熊風(fēng)》里的唯美場景嗎...
    Ailsa丶閱讀 106評論 0 0
  • 所謂祖宗十八代是指自己上下九代的宗族成員。 上按次序稱謂: 生己者為父母, 父之父為祖, 祖父之父為曾祖, 曾祖之...
    洞仙子閱讀 2,607評論 0 0

友情鏈接更多精彩內(nèi)容