Supponiamo di voler calcolare i coefficienti dei minimi quadrati in TensorFlow utilizzando la soluzione di forma chiusa. Normalmente, vorrei farlo in questo modo,Memorizzazione nella cache di un valore calcolato come costante in TensorFlow
beta_hat = tf.matmul(
tf.matmul(tf.matrix_inverse(tf.matmul(tf.transpose(X), X)), tf.transpose(X)), y
)
Dove X
e y
sono segnaposti tensorflow corrispondenti alle covariate e variabile di destinazione, rispettivamente.
Se dunque io volessi eseguire la previsione, vorrei fare qualcosa di simile,
y_pred = tf.matmul(X, beta_hat)
Se dovessi eseguire,
sess.run(y_pred, feed_dict={X: data_X})
avrei ovviamente ottenere un errore che non mi fornisco un valore necessario per il segnaposto . Mi piacerebbe avere la flessibilità di trattare beta_hat
come costante dopo averlo calcolato (in modo da non dover definire un nuovo segnaposto per la nuova matrice di covariate per la previsione). Un modo per raggiungere questo obiettivo è,
# Make it constant.
beta_hat = sess.run(beta_hat, feed_dict={X: data_X, y: data_y})
y_pred = tf.matmul(X, beta_hat)
mi chiedevo se ci fosse un modo più elegante per trattare il tensore costante in modo che io non bisogno di eseguire la sessione e ottenere una costante né creare un segnaposto separata per l'incoming dati da utilizzare per la previsione.
Ecco alcuni esempi di codice che dimostrano la circostanza che sto descrivendo.
import numpy as np
import tensorflow as tf
n, k = 100, 5
X = tf.placeholder(dtype=tf.float32, shape=[None, k])
y = tf.placeholder(dtype=tf.float32, shape=[None, 1])
beta = np.random.normal(size=(k,))
data_X = np.random.normal(size=(n, k))
data_y = data_X.dot(beta)
data_y += np.random.normal(size=data_y.shape)/3.0
data_y = np.atleast_2d(data_y).T
# Convert to 32-bit precision.
data_X, data_y = np.float32(data_X), np.float32(data_y)
# Compute the least squares solution.
beta_hat = tf.matmul(
tf.matmul(tf.matrix_inverse(tf.matmul(tf.transpose(X), X)),
tf.transpose(X)), y
)
# Launch the graph
sess = tf.Session()
sess.run(tf.initialize_all_variables())
print "True beta: {}".format(beta)
print "Est. beta: {}".format(
sess.run(beta_hat, feed_dict={X: data_X, y: data_y}).ravel()
)
# # This would error.
# y_pred = tf.matmul(X, beta_hat)
# print "Predictions:"
# print sess.run(y_pred, feed_dict={X: data_X})
# Make it constant.
beta_hat = sess.run(beta_hat, feed_dict={X: data_X, y: data_y})
# This will no longer error.
y_pred = tf.matmul(X, beta_hat)
print "Predictions:"
print sess.run(y_pred, feed_dict={X: data_X})
ravel == eval? (Oppure questa funzione è documentata?) –