Tensorflow-slim 學習筆記(二)第一層目錄代碼解讀_機器學習

來源:互聯網
上載者:User

http://www.cnblogs.com/bmsl/p/dongbin_bmsl_02.html

通過閱讀代碼來學習,一向時最直接快速的。本章將講解slim的第一層目錄tensorflow/tensorflow/contrib/slim/python/slim的代碼。

本層代碼主要包括learning.py, evaluation.py, summary.py, queue.py和model_analyzer.py,分別對應模型的訓練,測試,日誌記錄,隊列管理和模型分析部分。

讓巴默索淚來帶你由易到難來閱讀下這些代碼吧。以下內容基本按照難度排序。

1. 模型分析模組 model_analyzer.py

這段代碼提供了分析Tensorflow圖中的運算和變數的工具。

  #To analyze the operations in a graph:

  images, labels = LoadData(...)  
  predictions = MyModel(images)

  slim.model_analyzer.analyze_ops(tf.get_default_graph(), print_info=True)

  #To analyze the model variables in a graph:

  variables = tf.model_variables()  

  slim.model_analyzer.analyze_vars(variables, print_info=False)

2. queue.py提供了隊列內容管理代碼

3. summaries.py 包括了產生日至紀錄的輔助函數, summaries_test.py是它的一個測試,使用例子見下:

  import tensorflow as tf
  slim = tf.contrib.slim

  slim.summaries.add_histogram_summaries(slim.variables.get_model_variables())
  slim.summaries.add_scalar_summary(total_loss, 'Total Loss')
  slim.summaries.add_scalar_summary(learning_rate, 'Learning Rate')
  slim.summaries.add_histogram_summaries(my_tensors)
  slim.summaries.add_zero_fraction_summaries(my_tensors)

4.  evaluation.py一般不會使用slim的代碼,故忽略。

5. 最重要的訓練模型的代碼在learning.py中,其中learning_test.py是一個測試例子

    learning.py中包括訓練模型所需的多個函數,包括操作梯度,產生一個訓練操作(train_op, 一個計算loss並應用梯度的操作)以及訓練的迴圈函數。訓練迴圈要求使用者傳入train_op就可以進行最佳化。注意在這裡訓練迴圈使用了tf.train.Supervisor以及在它代碼實現中的managed_session,這可以保證機器可以從運行失敗中恢複訓練。Supervisor是對負責訓練程式的Coordinator,Saver和SessionManager的封裝。下面是一個簡單的例子:

  # Load data and create the model:

  images, labels = LoadData(...)
  predictions = MyModel(images)

  # Define the loss:
  slim.losses.log_loss(predictions, labels)
  total_loss = slim.losses.get_total_loss()

  # Define the optimizer:
  optimizer = tf.train.MomentumOptimizer(FLAGS.learning_rate, FLAGS.momentum)

  # Create the train_op
  train_op = slim.learning.create_train_op(total_loss, optimizer)

  # Run training.
  slim.learning.train(train_op, my_log_dir)

訓練必須首先定義一個 train_op, 它的作用包括:(1)計算損失(2)將梯度運用於參數的更新(3)返回損失值

train_op有時還必須在訓練時,執行額外的非梯度更新的操作,比如batch_norm。batch_norm在訓練時需要執行一系列非梯度的更新操作。slim.learning.create_train_op允許使用者同時將update_ops的列表以及梯度更新操作同時傳遞給函數。

  train_op = slim.learning.create_train_op(total_loss, optimizer, update_ops)  

預設情況下,slim.learning.create_train_op包括了所有在tf.GraphKeys.UPDATE_OPS集合中的更新操作。而且,slim的slim.batch_norm函數將moving mean和moving variance的更新加入了這個集合。因此,使用slim.batch_norm的使用者不用考慮任務多餘的步驟就能保證moving mean 和moving variance的更新會被正確的計算。如果使用者需要加入額外的更新操作,可以使用下面的代碼:

 

  # Force TF-Slim NOT to use ANY update_ops:
  train_op = slim.learning.create_train_op(
  total_loss,
  optimizer,
  update_ops=[])

 

  # Use an alternative set of update ops:
  train_op = slim.learning.create_train_op(
  total_loss,
  optimizer,
  update_ops=my_other_update_ops)

 

  # Use an alternative set of update ops in addition to the default updates:
  tf.add_to_collection(tf.GraphKeys.UPDATE_OPS, my_update0)
  tf.add_to_collection(tf.GraphKeys.UPDATE_OPS, my_update1)

 

  train_op = slim.learning.create_train_op(
  total_loss,
  optimizer)

 

  # Which is the same as:
  train_op = slim.learning.create_train_op(
  total_loss,
  optimizer,
  update_ops=tf.get_collection(tf.GraphKeys.UPDATE_OPS))

learning訓練最重要的有兩個函數:create_train_op以及train

 

(1)def create_train_op(total_loss,
                     optimizer,
                                 global_step=_USE_GLOBAL_STEP,
                                       update_ops=None,
                                       variables_to_train=None,
                                       clip_gradient_norm=0,
                                       summarize_gradients=False,
                                       gate_gradients=tf_optimizer.Optimizer.GATE_OP,
                                       aggregation_method=None,
                                       colocate_gradients_with_ops=False,
                                       gradient_multipliers=None,
                                       check_numerics=True)

        clip_gradient_norm:當它大於0時,梯度被截止於這個值。

傳回值時一個Tensor,它計算了梯度並返回了loss值。

(2)def train(train_op,

logdir,
train_step_fn=train_step,
train_step_kwargs=_USE_DEFAULT,
log_every_n_steps=1,
graph=None,
master='',
is_chief=True,
global_step=None,
number_of_steps=None,
init_op=_USE_DEFAULT,
init_feed_dict=None,
local_init_op=_USE_DEFAULT,
init_fn=None,
ready_op=_USE_DEFAULT,
summary_op=_USE_DEFAULT,
save_summaries_secs=600,
summary_writer=_USE_DEFAULT,
startup_delay_steps=0,
saver=None,
save_interval_secs=600,
sync_optimizer=None,
session_config=None,
trace_every_n_steps=None)

這個函數使用Tensorflow的supervisor運行了一個訓練迴圈。當使用sync_optimizer時,梯度計算是同步進行的。否則,梯度計算是非同步進行的。

參數:

log_every_n_steps:損失函數和step的列印頻率

master:tensorflow master的地址

is_chief:指定是否訓練是有主副本實現的,當進行多副本訓練時。

sync_optimizer:   一個tf.SyncReplicasOptimizer 或它們的一個列表。如果提供了這個參數,梯度更新會是同步的,如果使用None,則更新是非同步。


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.