2015-12-12 11 views
15

L'API parla dello Graph Collections che a giudicare dal numero code è una memoria di chiavi/dati di uso generale. Qual è lo scopo di queste collezioni?Qual è lo scopo delle raccolte di grafici in TensorFlow?

+2

Cerca "GraphKeys". per alcuni esempi di raccolte: vale a dire TrainableVariables: https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/ops/variables.py#L113, TableInitializers: https://tensorflow.googlesource.com/tensorflow /+/0.5.0/tensorflow/python/ops/data_flow_ops.py#521, Sintesi: https://tensorflow.googlesource.com/tensorflow/+/master/tensorflow/python/ops/summary_ops.py#48 –

+0

Ciao @ YaroslavBulatov puoi ri-pubblicare il tuo link? Gli ultimi due sono rotti. Grazie sempre! – Aaron

risposta

13

Ricordare che sotto il cofano, Tensorflow è un sistema per specificare e quindi eseguire i grafici del flusso di dati computazionale. Le raccolte di grafici sono utilizzate come parte del tracciamento dei grafici costruiti e di come devono essere eseguiti. Ad esempio, quando crei determinati tipi di operazioni, ad esempio tf.train.batch_join, il codice che aggiunge l'operazione aggiungerà anche alcuni corridori di coda alla raccolta di grafici QUEUE_RUNNERS. Successivamente, quando chiami start_queue_runners(), per impostazione predefinita, verrà esaminata la raccolta QUEUE_RUNNERS per sapere quali corridori iniziare.

+4

Sono ancora confuso sul concetto di collezioni. Aggiungendo diversi op in diverse raccolte, rende più efficiente la ricerca degli op? Sembra che la raccolta sia utile solo per raggruppare o organizzare le operazioni insieme senza apportare benefici "reali" al calcolo, giusto? Qui per "reale" intendo se rimuovo il concetto di raccolta dal sistema tensorflow, non danneggia il calcolo. – ZijunLost

+0

No, il punto delle collezioni non è l'efficienza, il punto è la contabilità. Le raccolte sono utilizzate per sapere quali variabili devono essere addestrate. O a quale op deve essere chiamato per allenarsi. Le raccolte sono una mappa da stringa a bit di set-di-grafico. Diverse stringhe conosciute sono memorizzate in GraphKeys. Questi si riferiscono a insiemi di bit di grafico importanti (ad es. Ops, variabili, ecc.) – BlessedKey

2

Penso che ci siano almeno due vantaggi per me finora:

  1. quando si distribuisce il programma su più GPU o macchine è conveniente per raccogliere le perdite da diversi dispositivi che si trovano nella stessa collezione. Utilizzare tf.add_n per aggiungerli per accumulare la perdita.
  2. Per aggiornare un determinato insieme di variabili come pesi e bias a modo mio.

Ad esempio:

import tensorflow as tf  
w = tf.Variable([1,2,3], collections=[tf.GraphKeys.WEIGHTS], dtype=tf.float32)  
w2 = tf.Variable([11,22,32], collections=[tf.GraphKeys.WEIGHTS], dtype=tf.float32) 
weight_init_op = tf.variables_initializer(tf.get_collection_ref(tf.GraphKeys.WEIGHTS)) 
sess = tf.InteractiveSession() 
sess.run(weight_init_op) 
for vari in tf.get_collection_ref(tf.GraphKeys.WEIGHTS): 
    tf.add_to_collection(tf.GraphKeys.UPDATE_OPS, vari.assign(0.2 * vari)) 
weight_update_ops = tf.get_collection_ref(tf.GraphKeys.UPDATE_OPS) 
sess.run(weight_update_ops) 

L'output:

[array ([0,2, ,40,000001 millions, ,60,000002 millions], dtype = float32), array ([2,20,000005 millions, 4,4000,001 mila, 6,4000,001 mila], dtype = float32)]

+0

Piccola nota sul codice ... quando si avvia tf.InteractiveSession(), perché non ne trarrai beneficio? Come in ... utilizzare weight_init_op.run() e weight_update_ops.eval() – zwep

+0

@zwep Sì, hai ragione. Forse non ho idea di quel trucco quando ho scritto questo .; Ad ogni modo il mio codice funziona. – lerner