tenorflow, mini-batch, tf.placeholder - состояние чтения узлов на заданной итерации

Я хочу напечатать значение 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

person sebtac    schedule 13.01.2018    source источник


Ответы (2)


Во-первых, я думаю, что такую ​​отладку, печать и прочее гораздо проще выполнить с активным выполнением, включенным в tensorflow.

Без включенного нетерпеливого выполнения «print» в тензорном потоке никогда не будет печатать динамическое значение тензора; он напечатает только имя тензора, что редко бывает тем, что вам нужно. Вместо этого используйте tf.Print для проверки значения тензора во время выполнения (выполняя что-то вроде tensor = tf.Print(tensor, [tensor]), поскольку tf.Print не выполняется, если его вывод где-то не используется).

person Alexandre Passos    schedule 16.01.2018
comment
Eager Execution - очень интересный функционал; я буду с нетерпением ждать его дальнейшего изучения, как только он станет частью официального релиза - person sebtac; 17.01.2018
comment
tf.Print - это все равно привело к печати объекта, а не значения объекта. это связано с тем, что я работаю с tf.placeholder, а не с фактическими переменными или константами. о подобном поведении сообщалось и в других сообщениях. Вы знаете, как заставить его работать с tf.placeholder? - person sebtac; 17.01.2018
comment
tf.Print печатает значение объекта. Вы можете привести мне пример того, где это не удается? - person Alexandre Passos; 17.01.2018
comment
спасибо, я привел пример в другом ответе на вопрос, чтобы он был более четко структурирован. простите за это. - person sebtac; 25.01.2018

Я заставил его работать, изменив оператор печати на следующее:

print("Epoch", epoch, "Batch_Index", batch_index, "MSE:", mse.eval(feed_dict={X: scaled_housing_data_plus_bias, y: housing_target}))

более того, сославшись на полный набор данных (не на партии), я смог проверить обобщение текущей пакетной модели на всю выборку. По мере обучения модели его должно быть легко расширить для тестирования на тестовых и удерживаемых образцах.

Боюсь, что такая оперативная оценка (даже на партиях) может повлиять на производительность модели. Я проведу дальнейшие испытания этого.

person sebtac    schedule 17.01.2018