1. 程式人生 > >Tensorflow原始碼解析5 -- 圖的邊

Tensorflow原始碼解析5 -- 圖的邊

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的生產者,會計算得到tensor self._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 = None self._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的過程為

  1. 獲取預設graph
  2. 對常量值value和常量值的型別dtype進行處理
  3. 構造並註冊型別為“Const”的運算元到預設graph中,從運算元的outputs中取出輸出的tensor。

此時只是圖的構造過程,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被劃分到不同的集合中,方便後續操作。常見的集合有

  1. 全域性變數:全域性變數可以在不同程序中共享,可運用在分散式環境中。變數預設會加入到全域性變數集合中。通過tf.global_variables()可以查詢全域性變數集合。其op標示為GraphKeys.GLOBAL_VARIABLES

    @tf_export("global_variables")
    def global_variables(scope=None):
      return ops.get_collection(ops.GraphKeys.GLOBAL_VARIABLES, scope)
    
  2. 本地變數:執行在程序內的變數,不能跨程序共享。通常用來儲存臨時變數,如訓練迭代次數epoches。通過tf.local_variables()可以查詢本地變數集合。其op標示為GraphKeys.LOCAL_VARIABLES

    @tf_export("local_variables")
    def local_variables(scope=None):
    	return ops.get_collection(ops.GraphKeys.LOCAL_VARIABLES, scope)
    
  3. 可訓練變數:一般模型引數會放到可訓練變數集合中,訓練時,做這些變數會得到改變。不在這個集合中的變數則不會得到改變。預設會放到此集合中。通過tf.trainable_variables()可以查詢。其op標示為GraphKeys.TRAINABLE_VARIABLES

    @tf_export("trainable_variables")
    def trainable_variables(scope=None):
      return ops.get_collection(ops.GraphKeys.TRAINABLE_VARIABLES, scope)
    

其他集合還有model_variables,moving_average_variables。

相關推薦

Tensorflow原始碼解析5 -- - Tensor

Tensorflow原始碼解讀系列文章,歡迎閱讀 帶你深入AI(1) - 深度學習模型訓練痛點及解決方法 自然語言處理1 – 分詞 Tensorflow原始碼解析1 – 核心架構和原始碼結構 Tensorflow原始碼解析2 – 前後端連線的橋樑 - Session Tensorflow

Tensorflow原始碼解析5 --

1 概述 前文兩篇文章分別講解了TensorFlow核心物件Graph,和Graph的節點Operation。Graph另外一大成員,即為其邊Tensor。邊用來表示計算的資料,它經過上游節點計算後得到,然後傳遞給下游節點進行運算。本文講解Graph的邊Ten

Tensorflow原始碼解析4 -- 的節點Operation

1 概述 上文講述了TensorFlow的核心物件,計算圖Graph。Graph包含兩大成員,節點和邊。節點即為計算運算元Operation,邊則為計算資料Tensor。由起始節點Source出發,按照Graph的拓撲順序,依次執行節點的計算,即可完成整圖的計算

Tensorflow原始碼解析4 -- 的節點 - Operation

Tensorflow原始碼解讀系列文章,歡迎閱讀 帶你深入AI(1) - 深度學習模型訓練痛點及解決方法 自然語言處理1 – 分詞 Tensorflow原始碼解析1 – 核心架構和原始碼結構 Tensorflow原始碼解析2 – 前後端連線的橋樑 - Session Tensorflow

Bi-LSTM-CRF(一)--tensorflow原始碼解析

1.1.核心程式碼: cell_fw = tf.contrib.rnn.LSTMCell(num_units=100) cell_bw = tf.contrib.rnn.LSTMCell(num_units=100) (outputs, output_states) =

Tensorflow原始碼解析1 -- 核心架構和原始碼結構

1 主流深度學習框架對比 當今的軟體開發基本都是分層化和模組化的,應用層開發會基於框架層。比如開發Linux Driver會基於Linux kernel,開發Android app會基於Android Framework。深度學習也不例外,框架層為上層模型開發提

Caffe原始碼解析5:Conv_Layer

Vision_layer裡面主要是包括了一些關於一些視覺上的操作,比如卷積、反捲積、池化等等。這裡的類跟data layer一樣好很多種繼承關係。主要包括了這幾個類,其中CuDNN分別是CUDA版本,這裡先不討論,在這裡先討論ConvolutionLayer BaseConvolutionLayer Co

學習筆記TF050:TensorFlow原始碼解析

TensorFlow目錄結構。 ACKNOWLEDGMENTS #TensorFlow版本宣告 ADOPTERS.md #使用TensorFlow的人員或組織列表 AUTHORS #TensorFlow作者的官方列表 BUILD CONTRIBUTING.md

Spring原始碼解析-5、IOC容器的依賴注入

IOC容器的初始化過程有沒有注入依賴 IOC容器的初始化過程: 1、BeanDefinition的Resource資源定位 2、BeanDefinition的載入與解析 3、BeanDefinition的註冊 這三個操作至始至終不存在Bean依賴注入。 因此: IOC容器的初始化過程不存

Tensorflow原始碼解析7 -- TensorFlow分散式執行時

Tensorflow原始碼解讀系列文章,歡迎閱讀 帶你深入AI(1) - 深度學習模型訓練痛點及解決方法 自然語言處理1 – 分詞 Tensorflow原始碼解析1 – 核心架構和原始碼結構 Tensorflow原始碼解析2 – 前後端連線的橋樑 - Session Tensorflow

Tensorflow原始碼解析6 -- TensorFlow本地執行時

Tensorflow原始碼解讀系列文章,歡迎閱讀 帶你深入AI(1) - 深度學習模型訓練痛點及解決方法 自然語言處理1 – 分詞 Tensorflow原始碼解析1 – 核心架構和原始碼結構 Tensorflow原始碼解析2 – 前後端連線的橋樑 - Session Tensorflow

Tensorflow原始碼解析3 -- TensorFlow核心物件 - Graph

Tensorflow原始碼解讀系列文章,歡迎閱讀 帶你深入AI(1) - 深度學習模型訓練痛點及解決方法 自然語言處理1 – 分詞 Tensorflow原始碼解析1 – 核心架構和原始碼結構 Tensorflow原始碼解析2 – 前後端連線的橋樑 - Session Tensorflow

Tensorflow原始碼解析2 -- 前後端連線的橋樑 - Session

Tensorflow原始碼解讀系列文章,歡迎閱讀 帶你深入AI(1) - 深度學習模型訓練痛點及解決方法 自然語言處理1 – 分詞 Tensorflow原始碼解析1 – 核心架構和原始碼結構 Tensorflow原始碼解析2 – 前後端連線的橋樑 - Session Tensorflow

Java原始碼解析(5) —— Class(4)

Class最後一部分原始碼,這一部分大都是private方法、屬性、類,都是Class本身各種方法的實現細節,涉及到了很多Class的實現原理,較為深奧,網上能找到的資料也比較少,目前只懂皮毛,僅供參考,所以,我這一部分說的可能是不正確的,需要抱著懷疑的態度看待

spring boot 原始碼解析5-SpringApplication#run第5

前言 之前的文章我們分析了SpringApplication#run方法執行的前4步,這裡我們分析第5步,列印banner. 解析 SpringApplication#run方法的第5步執行如下程式碼: private Banner printBa

Tensorflow原始碼解析2 -- 前後端連線的橋樑

1 Session概述 Session是TensorFlow前後端連線的橋樑。使用者利用session使得client能夠與master的執行引擎建立連線,並通過session.run()來觸發一次計算。它建立了一套上下文環境,封裝了operation計算以及

死磕 java同步系列之CyclicBarrier原始碼解析——有有真相

問題 (1)CyclicBarrier是什麼? (2)CyclicBarrier具有什麼特性? (3)CyclicBarrier與

Spring5原始碼解析5-ConfigurationClassPostProcessor (上)

接上回,我們講到了refresh()方法中的invokeBeanFactoryPostProcessors(beanFactory)方法主要在執行BeanFactoryPostProcessor和其子介面BeanDefinitionRegistryPostProcessor的方法。 在建立Annotation

分享《TensorFlow技術解析與實戰》高清中文PDF+原始碼

下載:https://pan.baidu.com/s/1jdZ9eSrZ7xnsbbMIUO17qQ 《TensorFlow技術解析與實戰》高清中文PDF+原始碼 高清中文PDF,311頁,帶目錄和書籤,文字可以複製貼上,彩色配圖。配套原始碼。經典書籍。本書從深度學習的基礎講起,深入TensorFlow框

TensorFlow原始碼系列】【四】優化演算法:constant folding和CSE

TensorFlow中使用的圖優化演算法有:constant folding 和CSE(common-subexpression elimination) 【演算法一】constant folding 該演算法,是將graph中常量的計算合併起來。例如: C = A+B,其中A和B都是con