La cosa più importante da capire su tensorflow è che, per la maggior parte, il nucleo non è scritto in Python: E 'scritto in una combinazione di altamente ottimizzato C++ e CUDA (lingua di Nvidia per le GPU di programmazione). Molto di ciò accade, a sua volta, utilizzando Eigen (una libreria numerica C++ e CUDA ad alte prestazioni) e NVidia's cuDNN (una libreria DNN ottimizzata per NVidia GPUs, per funzioni come convolutions).
Il modello per TensorFlow è che il programmatore utilizza "un linguaggio" (molto probabilmente Python!) Per esprimere il modello. Questo modello, scritto nel tensorflow costrutti quali:
h1 = tf.nn.relu(tf.matmul(l1, W1) + b1)
h2 = ...
non è in realtà eseguita quando il Python viene eseguito. Invece, ciò che viene effettivamente creato è un dataflow graph che dice di prendere particolari input, applicare particolari operazioni, fornire i risultati come input ad altre operazioni, e così via. Questo modello viene eseguito con un codice C++ veloce e, per la maggior parte, i dati che vanno tra le operazioni non vengono mai ricondotti al codice Python.
Poi il programmatore "spinge" l'esecuzione di questo modello tirando su nodi - per la formazione, di solito in Python, e per servire, a volte in Python e talvolta in RAW C++:
sess.run(eval_results)
Questo Python (o chiamata di funzione C++) utilizza una chiamata in-process a C++ o uno RPC per la versione distribuita per chiamare nel server C++ TensorFlow per dirgli di eseguire, e quindi copia i risultati.
Quindi, con ciò detto, riformuliamo la domanda: perché TensorFlow ha scelto Python come il primo linguaggio ben supportato per esprimere e controllare l'allenamento dei modelli?
La risposta è semplice: Python è probabilmente il più comodo lingua per una vasta gamma di scienziati di dati e gli esperti di apprendimento automatico che è anche facile da integrare e avere il controllo di un back-end C++, mentre anche essere generale, ampiamente utilizzato sia all'interno che all'esterno di Google e open source. Dato che con il modello base di TensorFlow, le prestazioni di Python non sono così importanti, era una scelta naturale.È anche un enorme vantaggio che lo NumPy rende facile eseguire la pre-elaborazione in Python, anche con alte prestazioni, prima di inviarlo a TensorFlow per le cose veramente pesanti della CPU.
C'è anche un po 'di complessità nell'esprimere il modello che non viene usato durante l'esecuzione - inferenza della forma (ad esempio, se si fa matmul (A, B), qual è la forma dei dati risultanti?) E calcolo automatico gradient. È stato bello essere in grado di esprimere quelli in Python, anche se penso che a lungo termine si sposteranno probabilmente sul backend C++ per facilitare l'aggiunta di altre lingue.
(La speranza, ovviamente, è supportare altre lingue in futuro per la creazione e l'espressione di modelli È già abbastanza semplice eseguire inferenza usando diversi altri linguaggi - C++ funziona ora, qualcuno da Facebook ha contribuito con Go associazioni stiamo rivedendo ora, ecc.)
Minore nitpick: la compilazione e l'interpretazione non sono opposti. Inoltre, qualsiasi linguaggio di programmazione può essere implementato con un compilatore o con un interprete o entrambi. C'è una bella [risposta] (https://softwareengineering.stackexchange.com/a/269878/121035) sulla distinzione rispetto a Software Engineering. – 8bittree