判定两个tensor维度相同_Tensorflow源码解析5 -- 图的边 - Tensor
1 概述
前文兩篇文章分別講解了TensorFlow核心對象Graph,和Graph的節點Operation。Graph另外一大成員,即為其邊Tensor。邊用來表示計算的數據,它經過上游節點計算后得到,然后傳遞給下游節點進行運算。本文講解Graph的邊Tensor,以及TensorFlow中的變量。
2 前端邊Tensor數據結構
Tensor作為Graph的邊,使得節點Operation之間建立了連接。上游源節點Operation經過計算得到數據Tensor,然后傳遞給下游目標節點,是一個典型的生產者-消費者關系。下面來看Tensor的數據結構
@tf_export("Tensor") class Tensor(_TensorLike):def __init__(self, op, value_index, dtype):# 源節點,tensor的生產者,會計算得到tensorself._op = op ?# tensor在源節點的輸出邊集合中的索引。源節點可能會有多條輸出邊# 利用op和value_index即可唯一確定tensor。self._value_index = value_index ?# tensor中保存的數據的數據類型self._dtype = dtypes.as_dtype(dtype) ?# tensor的shape,可以得到張量的rank,維度等信息self._shape_val = tensor_shape.unknown_shape() ?# 目標節點列表,tensor的消費者,會使用該tensor來進行計算self._consumers = [] ?#self._handle_data = Noneself._id = uid() ?Tensor中主要包含兩類信息,一個是Graph結構信息,如邊的源節點和目標節點。另一個則是它所保存的數據信息,例如數據類型,shape等。
3 后端邊Edge數據結構
后端中的Graph主要成員也是節點node和邊edge。節點node為計算算子Operation,邊Edge為算子所需要的數據,或者代表節點間的依賴關系。這一點和Python中的定義相似。邊Edge的持有它的源節點和目標節點的指針,從而將兩個節點連接起來。下面看Edge類的定義。
class Edge {private:Edge() {} ?friend class EdgeSetTest;friend class Graph;// 源節點, 邊的數據就來源于源節點的計算。源節點是邊的生產者Node* src_; ?// 目標節點,邊的數據提供給目標節點進行計算。目標節點是邊的消費者Node* dst_; ?// 邊id,也就是邊的標識符int id_; ?// 表示當前邊為源節點的第src_output_條邊。源節點可能會有多條輸出邊int src_output_; ?// 表示當前邊為目標節點的第dst_input_條邊。目標節點可能會有多條輸入邊。int dst_input_; }; ?Edge既可以承載tensor數據,提供給節點Operation進行運算,也可以用來表示節點之間有依賴關系。對于表示節點依賴的邊,其src_output_, dst_input_均為-1,此時邊不承載任何數據。
4 常量constant
TensorFlow的常量constant,最終包裝成了一個Tensor。通過tf.constant(10),返回一個Tensor對象。
@tf_export("constant") def constant(value, dtype=None, shape=None, name="Const", verify_shape=False):# 算子注冊到默認Graph中g = ops.get_default_graph()# 對常量值value的處理tensor_value = attr_value_pb2.AttrValue()tensor_value.tensor.CopyFrom(tensor_util.make_tensor_proto(value, dtype=dtype, shape=shape, verify_shape=verify_shape)) ?# 對常量值的類型dtype進行處理dtype_value = attr_value_pb2.AttrValue(type=tensor_value.tensor.dtype) ?# 構造并注冊類型為“Const”的算子到Graph中,從算子的outputs中取出輸出的tensor。const_tensor = g.create_op("Const", [], [dtype_value.type],attrs={"value": tensor_value,"dtype": dtype_value},name=name).outputs[0]return const_tensor ?tf.constant的過程為
此時只是圖的構造過程,tensor并未承載數據,僅表示Operation輸出的一個符號句柄。經過tensor.eval()或session.run()后,才會啟動graph的執行,并得到數據。
5 變量Variable
Variable構造器
通過tf.Variable()構造一個變量,代碼如下,我們僅分析入參。
@tf_export("Variable") class Variable(object):def __init__(self,initial_value=None,trainable=True,collections=None,validate_shape=True,caching_device=None,name=None,variable_def=None,dtype=None,expected_shape=None,import_scope=None,constraint=None): # initial_value: 初始值,為一個tensor,或者可以被包裝為tensor的值 # trainable:是否可以訓練,如果為false,則訓練時不會改變 # collections:變量要加入哪個集合中,有全局變量集合、本地變量集合、可訓練變量集合等。默認加入全局變量集合中 # dtype:變量的類型 ?主要的入參代碼中已經給出了注釋。Variable可以接受一個tensor或者可以被包裝為tensor的值,來作為初始值。事實上,Variable可以看做是Tensor的包裝器,它重載了Tensor的幾乎所有操作,是對Tensor的進一步封裝。
Variable初始化
變量只有初始化后才能使用,初始化時將initial_value初始值賦予Variable內部持有的Tensor。通過運行變量的初始化器可以對變量進行初始化,也可以執行全局初始化器。如下
y = tf.Variable([5.3]) ? with tf.Session() as sess:initialization = tf.global_variables_initializer()print sess.run(y) ?Variable集合
Variable被劃分到不同的集合中,方便后續操作。常見的集合有
其他集合還有model_variables,moving_average_variables。
系列文章,歡迎閱讀
謝楊易:Tensorflow源碼解析1 -- 內核架構和源碼結構?zhuanlan.zhihu.com謝楊易:Tensorflow源碼解析2 -- 前后端連接的橋梁 - Session?zhuanlan.zhihu.com謝楊易:Tensorflow源碼解析3 -- TensorFlow核心對象 - Graph?zhuanlan.zhihu.com謝楊易:Tensorflow源碼解析4 -- 圖的節點 - Operation?zhuanlan.zhihu.com謝楊易:Tensorflow源碼解析5 -- 圖的邊 - Tensor?zhuanlan.zhihu.com謝楊易:Tensorflow源碼解析6 -- TensorFlow本地運行時?zhuanlan.zhihu.com謝楊易:Tensorflow源碼解析7 -- TensorFlow分布式運行時?zhuanlan.zhihu.com 超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的判定两个tensor维度相同_Tensorflow源码解析5 -- 图的边 - Tensor的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql delete 会锁表吗_My
- 下一篇: 机器学习如何计算特征的重要性_干货 :机