Angenommen, ich möchte die Koeffizienten der kleinsten Quadrate in TensorFlow mithilfe der Lösung in geschlossener Form berechnen. Normalerweise würde ich dies tun, wie so,Caching eines berechneten Werts als Konstante in TensorFlow
beta_hat = tf.matmul(
tf.matmul(tf.matrix_inverse(tf.matmul(tf.transpose(X), X)), tf.transpose(X)), y
)
Wo X
und y
TensorFlow Platzhalter sind für die Kovariaten und Zielgröße entsprechen.
Wenn ich dann Vorhersage ausführen wollte, würde ich so etwas tun,
y_pred = tf.matmul(X, beta_hat)
Wenn ich auszuführen waren,
sess.run(y_pred, feed_dict={X: data_X})
ich natürlich einen Fehler bekommen würde, dass ich nicht vorsah ein notwendiger Wert für den Platzhalter y
. Ich hätte gerne die Flexibilität, beta_hat
als Konstante zu behandeln, nachdem ich es berechnet habe (so dass ich keinen neuen Platzhalter für die neue Kovariatenmatrix für die Vorhersage definieren müsste). Eine Möglichkeit, dies zu erreichen ist,
# Make it constant.
beta_hat = sess.run(beta_hat, feed_dict={X: data_X, y: data_y})
y_pred = tf.matmul(X, beta_hat)
ich mich gefragt, ob es eine elegantere Art und Weise war die Tensor als konstant zu behandeln, so dass ich weder brauche die Sitzung auszuführen und eine Konstante erhält noch einen separaten Platzhalter für eingehende erstellen Daten, die für die Vorhersage verwendet werden.
Hier ist ein Beispielcode, der die Umstände, die ich beschreibe, zeigt.
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? (Oder ist diese Funktion dokumentiert?) –