Я хочу напечатать значение MSE для каждой комбинации эпох / пакетов. приведенный ниже код сообщает о тензорном объекте, представляющем mse вместо его значения на каждой итерации:
print("Epoch", epoch, "Batch_Index", batch_index, "MSE:", mse)
Пример строки вывода:
Эпоха 0 Batch_Index 0 MSE: Tensor ("mse_2: 0", shape = (), dtype = float32)
Я понимаю, что это потому, что MSE ссылается на узлы tf.placeholder, которые сами по себе не имеют никаких данных. Но как только я запустил следующий код:
sess.run(training_op, feed_dict={X: X_batch, y: y_batch})
данные должны быть уже доступны, поэтому значения для всех узлов в зависимости от этих данных также должны быть доступны, я думаю, что запрос оценки MSE в операторе печати приводит к ошибке
print("Epoch", epoch, "Batch_Index", batch_index, "MSE:", mse.eval())
Выход2:
InvalidArgumentError: вы должны передать значение тензора заполнителя 'X_2' с помощью dtype float и shape [?, 9] ...
Это говорит мне, что mse.eval()
не видит данных, определенных в sess.run()
Почему мы наблюдаем такое поведение? Как нам изменить код, чтобы он сообщал MSA на каждой указанной итерации?
import numpy as np
from sklearn.datasets import fetch_california_housing
housing = fetch_california_housing()
m, n = housing.data.shape
housing_data_plus_bias = np.c_[np.ones((m, 1)), housing.data] # ADD COLUMN OF 1s for BIAS!
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaled_housing_data = scaler.fit_transform(housing.data)
scaled_housing_data_plus_bias = np.c_[np.ones((m, 1)), scaled_housing_data]
X = tf.placeholder(tf.float32, shape=(None, n + 1), name="X")
y = tf.placeholder(tf.float32, shape=(None, 1), name="y")
theta = tf.Variable(tf.random_uniform([n + 1, 1], -1.0, 1.0, seed=42), name="theta")
y_pred = tf.matmul(X, theta, name="predictions")
error = y_pred - y
mse = tf.reduce_mean(tf.square(error), name="mse")
optimizer = tf.train.GradientDescentOptimizer(learning_rate=learning_rate)
training_op = optimizer.minimize(mse)
init = tf.global_variables_initializer()
n_epochs = 100
batch_size = 100
n_batches = int(np.ceil(m / batch_size))
learning_rate = 0.01
def fetch_batch(epoch, batch_index, batch_size):
np.random.seed(epoch * n_batches + batch_index) # not shown in the book
indices = np.random.randint(m, size=batch_size) # not shown
X_batch = scaled_housing_data_plus_bias[indices] # not shown
y_batch = housing.target.reshape(-1, 1)[indices] # not shown
return X_batch, y_batch
with tf.Session() as sess:
sess.run(init)
for epoch in range(n_epochs):
for batch_index in range(n_batches):
X_batch, y_batch = fetch_batch(epoch, batch_index, batch_size)
sess.run(training_op, feed_dict={X: X_batch, y: y_batch})
if (epoch % 50 == 0 and batch_index % 100 == 0):
print("Epoch", epoch, "Batch_Index", batch_index, "MSE:", mse)
best_theta = theta.eval()
best_theta