2017-04-09 41 views
0

我是張量流的新手。但是我認爲對tesnorflow核心操作的理解是必須的。如果我們以面向對象的方式使用tf python API,我們可以根據定義創建不同的圖形操作。使用python API執行張量流圖時實際發生了什麼?

def _create_placeholders(self): 
    """ Step 1: define the placeholders for input and output """ 
    with tf.name_scope("data"): 
     self.center_words = tf.placeholder(tf.int32, shape=[self.batch_size], name='center_words') 
     print("Extracting the op",self.center_words.op) 
     self.target_words = tf.placeholder(tf.int32, shape=[self.batch_size, 1], name='target_words') 
     print("so",self.center_words.op) 

def _create_embedding(self): 
    """ Step 2: define weights. In word2vec, it's actually the weights that we care about """ 
    # Assemble this part of the graph on the CPU. You can change it to GPU if you have GPU 
    with tf.device('/cpu:0'): 
     with tf.name_scope("embed"): 
      self.embed_matrix = tf.Variable(tf.random_uniform([self.vocab_size, 
                   self.embed_size], -1.0, 1.0), 
                   name='embed_matrix') 

def _create_loss(self): 
    """ Step 3 + 4: define the model + the loss function """ 
    with tf.device('/cpu:0'): 
     with tf.name_scope("loss"): 
      # Step 3: define the inference 
      embed = tf.nn.embedding_lookup(self.embed_matrix, self.center_words, name='embed') 

      # Step 4: define loss function 
      # construct variables for NCE loss 
      nce_weight = tf.Variable(tf.truncated_normal([self.vocab_size, self.embed_size], 
                 stddev=1.0/(self.embed_size ** 0.5)), 
                 name='nce_weight') 
      nce_bias = tf.Variable(tf.zeros([VOCAB_SIZE]), name='nce_bias') 


      # define loss function to be NCE loss function 
      self.loss = tf.reduce_mean(tf.nn.nce_loss(weights=nce_weight, 
               biases=nce_bias, 
               labels=self.target_words, 
               inputs=embed, 
               num_sampled=self.num_sampled, 
               num_classes=self.vocab_size), name='loss') 

這裏我提到了兩個用於創建嵌入和計算損失的定義。 因此,如果我運行這個def的其中一個,它將在圖中創建一個節點。我通過了tf源代碼,我在圖形構建階段看到的是在這個階段它會將每一個操作加載到某種緩衝區中。 然後在會議期間,我們只是用真實數據重新運行每一件事。

with tf.Session(config=tf.ConfigProto(log_device_placement=False)) as sess: 
    sess.run(tf.global_variables_initializer()) 

    ckpt = tf.train.get_checkpoint_state(os.path.dirname('c/checkpointsq')) 
    # if that checkpoint exists, restore from checkpoint 
    if ckpt and ckpt.model_checkpoint_path: 
     print("Restoring the checkpoins") 
     saver.restore(sess, ckpt.model_checkpoint_path) 

    total_loss = 0.0 # we use this to calculate late average loss in the last SKIP_STEP steps 
    writer = tf.summary.FileWriter('./ improved_graph/lr' + str(LEARNING_RATE), sess.graph) 
    initial_step = model.global_step.eval() 

    for index in range(1): 
     centers, targets = batch_gen.__next__() 
     feed_dict={model.center_words: centers, model.target_words: targets} 
     loss_batch, _, summary = sess.run([model.loss, model.optimizer, model.summary_op], 
              feed_dict=feed_dict) 

這是我的問題。在sess.run中tensorflow甚至不關心python API。它只關心從上面的圖形初始化代碼加載的圖形操作。 我的問題是,所有這些操作都在會話對象中執行。我能理解它的核心。我們有任何訪問權限嗎?

+0

你想要什麼樣的訪問?例如,你想調試圖表並查看中間輸入/輸出嗎? – MohamedEzz

+0

我需要知道所有圖形在哪裏執行? –

+1

如果您使用GPU,它們由tensorflow的C++代碼或CUDA部分執行 – MohamedEzz

回答

1

我相信建立圖的反向傳播部分的代碼是here

compute_gradients()由minimize()調用,然後由用戶代碼調用。

在已經構建的TensorFlow圖表中的ops的調度和執行發生在function之內。

+0

明白了。因此,作爲最後一個問題,這個** Status DirectSession :: Run **將所有圖形合併到C++實現中並進行計算。 –

+1

是的,一個已經構建的圖被傳遞給DirectSession :: Create會話,https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/common_runtime/direct_session.cc#L332和DirectSession ::運行將在此圖中運行所有操作。 –

相關問題