Tensorflow是一個計算密集型的編程系統,使用圖(graphs)來表示計算任務,圖(graphs)中的節點稱之爲op(operation),一個op得到0個或多個Tensor,執行計算,產生0個或多個Tensor。 Tensor 看做是一個 n 維的數組或列表。圖必須在會話(Session)裏被啓動html
使用圖(graphs)來表示計算任務
在被稱之爲會話(Session)的上下文(context)中執行圖
使用tensor表示數據
經過變量(Variable)維護狀態
使用feed和fetch能夠爲任意的操做賦值或者從其中獲取數據python
Tensorflow結構
linux
CPU版本:編程
pip install http://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-1.0.1-cp35-cp35m-linux_x86_64.whlapi
CPU版本:數組
pip install --upgrade --ignore-installed tensorflow瀏覽器
圖默認已經註冊,一組表示 tf.Operation計算單位的對象和tf.Tensor 表示操做之間流動的數據單元的對象session
獲取默認圖:app
tf.get_default_graph()
建立新圖並使用:dom
g = tf.Graph()
with g.as_default():#在上下文管理器(with模塊)中,g做爲默認圖
a = tf.constant(1.0)
運行TensorFlow操做圖的類,使用默認註冊的圖(能夠指定運行圖)
會話可能擁有不少資源,如 tf.Variable,tf.QueueBase 和tf.ReaderBase,會話結束後須要進行資源釋放(能夠用with上下文管理器實現)
會話運行後返回值異常: RuntimeError:若是它Session處於無效狀態(例如已關閉)。
TypeError:若是fetches或feed_dict鍵是不合適的類型。
ValueError:若是fetches或feed_dict鍵無效或引用 Tensor不存在
Tensorflow 中Feed操做(佔位):
意義:在程序執行的時候,不肯定輸入的是什麼,提早「佔個坑」
語法:placeholder提供佔位符,run時候經過feed_dict指定參數
例:
import tensorflow as tf val1 = tf.placeholder(tf.float32) val2 = tf.placeholder(tf.float32) sum = tf.add(val1, val2) with tf.Session() as sess: print(sess.run(sum,feed_dict={val1:1.0, val2:2.0}))
張量是Tensorflow基本的數據格式, 有三部分:形狀,數據類型,名字
張量的屬性: graph(張量所屬的默認圖) op(張量的操做名) name(張量的字符串描述) shape(張量形狀)
靜態形狀: 建立一個張量或者由操做推導出一個張量時,初始狀態的形狀
tf.Tensor.get_shape:獲取靜態形狀
tf.Tensor.set_shape():更新Tensor對象的靜態形狀,一般用於在不能直接推 斷的狀況下
注意:
一、轉換靜態形狀的時候,遵循1-D到1-D,2-D到2-D的規則,不能跨階數改變形狀
二、 對於已經固定或者設置靜態形狀的張量/變量,不能再次設置靜態形狀
動態形狀: 一種描述原始張量在執行過程當中的一種形狀
tf.reshape:改變原來的形狀建立一個具備不一樣動態形狀的新張量
注意:
一、tf.reshape()動態建立新張量時,元素個數須要和改變前的個數匹配
tf.random_normal(shape,mean=0.0, stddev=1.0,dtype=tf.float32,seed=None,name=None) (經常使用)
tf.zeros(shape,dtype=tf.float32,name=None)
tf.ones(shape,dtype=tf.float32,name=None)
tf.constant(value,dtype=None,shape=None,name="Const")
... ...
詳細的能夠參考API(中文):http://wiki.jikexueyuan.com/project/tensorflow-zh/api_docs/python/index.html
tf.String_to_number(string_tensor,out_type=None,name=None)
tf.cast(x, dtype, name=None)
tf.shape(input, name=None)
tf.reshape(tensor, shape, name=None)
... ...
tf.concat(values, axis, name='concat')
變量也是一種OP,是一種特殊的張量,可以進行存儲持久化,它的 值就是張量
1)、變量的建立
tf.Variable(initial_value=None,name=None) 建立一個帶值initial_value的新變量 name屬性表示變量名字
assign(value) 爲變量分配一個新值 返回新值
eval(session=None) 計算並返回此變量的值
2)、變量的初始化
tf.global_variables_initializer()
3)、變量的做用域
做用 : 讓模型代碼更加清晰,做用分明, 在tensorboard中更易閱讀
建立:
tf.variable_scope(<scope_name>)建立指定名字的 變量做用域
如:
with tf.variable_scope("train"): '''
做用域內的代碼
'''
TensorBoard 經過讀取 TensorFlow 的數據序列化-events文件來運行
在程序中加入代碼:
tf.summary.FileWriter('路徑', graph= 想可視化的圖) 返回filewriter,寫入事件文件到指定目錄(最好用絕對路徑),以提供給tensorboard使用
在命令行開啓:
tensorboard --logdir=/tmp/tensorflow/summary/test/
通常瀏覽器打開爲127.0.0.1:6006
注:修改程序後,再保存一遍會有新的事件文件,打開默認爲最新
tensorboard中,圖的符號意義:
在tensorboard中顯示變量的變化:
一、收集變量: tf.summary.scalar(name=’’,tensor) 收集對於損失函數和準確率 等單值變量,name爲變量的名字,tensor爲值
tf.summary.histogram(name=‘’,tensor) 收集高維度的變量參數
tf.summary.image(name=‘’,tensor) 收集輸入的圖片張量能顯示圖片
二、合併變量寫入事件文件:merged = tf.summary.merge_all()
三、運行合併:summary = sess.run(merged),每次迭代都需運行
四、添加:FileWriter.add_summary(summary,i),i表示第幾回的值
建立一個Saver對象(假設返回saver,用於模型保存和加載):
tf.train.Saver(var_list=None,max_to_keep=5) 其中:
var_list:指定將要保存和還原的變量。它能夠做爲一個 dict或一個列表傳遞.
max_to_keep:指示要保留的最近檢查點文件的最大數量。 建立新文件時,會刪除較舊的文件。若是無或0,則保留全部 檢查點文件。默認爲5(即保留最新的5個檢查點文件。)
保存模型:
saver.save(sess,"保存模型的路徑(本身指定目錄便可)"
保存文件格式:checkpoint文件
加載模型:
saver.restore(sess,"保存模型的路徑(和上面的路徑一致)"
一、tf.app.flags,它支持應用從命令行接收參數,能夠用來指定集羣配置等.在它下面有各類定義參數的類型:
DEFINE_string(flag_name, default_value, docstring)
DEFINE_integer(flag_name, default_value, docstring)
DEFINE_boolean(flag_name, default_value, docstring)
DEFINE_float(flag_name, default_value, docstring)
二、tf.app.flags.,在flags有一個FLAGS標誌,它在程序中能夠調用到咱們 前面具體定義的flag_name
三、經過tf.app.run()啓動main(argv)函數
def mylinearregression(): """ 自實現線性迴歸 :return: None """ with tf.variable_scope("data"): #做用域 # 手動建立訓練數據 # x表示訓練數據的特徵 有100個樣本,1個特徵 X = tf.random_normal([100, 1], mean=0.0, stddev=1.0, name="X") #生成一組服從標準正太分佈的數據 # y_true表示訓練數據的標籤, 跟x是線性關係 y_true = tf.matmul(X, [[0.7]]) + 0.8 with tf.variable_scope("model"): #做用域 # 創建模型 # 由準備的數據(x是100行1列的數據,y_true也是100行1列的數據)能夠看出,權重是 1行1列的數據 weights = tf.Variable(tf.random_normal([1, 1], mean=0.0, stddev=1.0), name="weights") bias = tf.Variable(0.0) # 得出預測值 y_predict = tf.matmul(X, weights) + bias with tf.variable_scope("Optimize"): #做用域 # 計算真實值與預測值之間的均方偏差(損失函數) loss = tf.reduce_mean(tf.square(y_true - y_predict)) #tf.square求方差 tf.reduce_mean求均值 # 梯度降低優化偏差,指定學習率,返回一個梯度降低優化器 train_op = tf.train.GradientDescentOptimizer(0.2).minimize(loss) # 收集變量 tf.summary.scalar("loss", loss) tf.summary.scalar("bias", bias) tf.summary.histogram("weight", weights) # 定義初始化變量OP init_op = tf.global_variables_initializer() # 定義一個合併變量的OP merged = tf.summary.merge_all() # 建立一個Saver saver = tf.train.Saver() # 開啓會話 with tf.Session() as sess: # 運行初始化 sess.run(init_op) # 打印一下初始化隨機的權重和偏置 print("隨機初始化的權重爲%f,偏置爲%f" % (weights.eval(), bias.eval())) # 建立事件文件 filewriter = tf.summary.FileWriter("./tmp/summary/test/", graph=sess.graph) #此路徑只須指定目錄且目錄存在 # 加載模型 if os.path.exists("./tmp/ckpt/checkpoint"): #此路徑中目錄與模型保存的目錄一致,文件名固定爲checkpoint saver.restore(sess, "./tmp/ckpt/regressionmodel")#此路徑與模型保存的路徑一致 # 循環優化, 30是指定訓練的步數(可更改) for i in range(30): # 運行優化 sess.run(train_op) # 運行合併結果 summary = sess.run(merged) # 寫入變量結果 filewriter.add_summary(summary, i) print("訓練第%d次的結果:權重爲%f,偏置爲%f" % (i, weights.eval(), bias.eval()))
# 保存模型 saver.save(sess, "./tmp/ckpt/regressionmodel")#路徑中的目錄路徑須存在,且要指定文件名稱
return None
# 自定義命令行參數 tf.app.flags.DEFINE_string("data_home", "./data/", "訓練數據來源") tf.app.flags.DEFINE_integer("max_step", 10000, "訓練步數") FLAGS = tf.app.flags.FLAGS def main(argv): print(argv) print(FLAGS.data_home) print(FLAGS.max_step) if __name__ == "__main__": tf.app.run()