Повлият ли неиспользованные заполнители в тензорном потоке на результат? - PullRequest
2 голосов
/ 14 января 2020

В моем коде был неиспользованный заполнитель, который был разработан для дальнейших целей. Тем не менее, я обнаружил, что добавление или нет его будет влиять на стоимость для каждой эпохи и события конечного результата (например, точность, au c). Я проверил, что он не был связан с графом вычислений, так как заполнитель был добавлен поверх полной программы, и он появляется только один раз в коде. Поскольку мой проект немного громоздок для воспроизведения, я попытался воспроизвести его, используя простой фрагмент кода, скопированный из блога https://adventuresinmachinelearning.com/python-tensorflow-tutorial/.

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
tf.random.set_random_seed(1234)

mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
# Python optimisation variables
learning_rate = 0.5
epochs = 10
batch_size = 100

# declare the training data placeholders
# input x - for 28 x 28 pixels = 784
x = tf.placeholder(tf.float32, [None, 784])
# now declare the output data placeholder - 10 digits
y = tf.placeholder(tf.float32, [None, 10])

# zz = tf.placeholder(tf.float32, name='zz') <--- the added placeholder

# now declare the weights connecting the input to the hidden layer
W1 = tf.Variable(tf.random_normal([784, 300], stddev=0.03), name='W1')
b1 = tf.Variable(tf.random_normal([300]), name='b1')
# and the weights connecting the hidden layer to the output layer
W2 = tf.Variable(tf.random_normal([300, 10], stddev=0.03), name='W2')
b2 = tf.Variable(tf.random_normal([10]), name='b2')

# calculate the output of the hidden layer
hidden_out = tf.add(tf.matmul(x, W1), b1)
hidden_out = tf.nn.relu(hidden_out)

# now calculate the hidden layer output - in this case, let's use a softmax activated
# output layer
y_ = tf.nn.softmax(tf.add(tf.matmul(hidden_out, W2), b2))

y_clipped = tf.clip_by_value(y_, 1e-10, 0.9999999)
cross_entropy = -tf.reduce_mean(tf.reduce_sum(y * tf.log(y_clipped)
                                              + (1 - y) * tf.log(1 - y_clipped), axis=1))

# add an optimiser
optimiser = tf.train.GradientDescentOptimizer(learning_rate=learning_rate).minimize(cross_entropy)

# finally setup the initialisation operator
init_op = tf.global_variables_initializer()

# define an accuracy assessment operation
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

# start the session
with tf.Session() as sess:
    # initialise the variables
    sess.run(init_op)
    total_batch = int(len(mnist.train.labels) / batch_size)
    for epoch in range(epochs):
        avg_cost = 0
        for i in range(total_batch):
            batch_x, batch_y = mnist.train.next_batch(batch_size=batch_size)
            _, c = sess.run([optimiser, cross_entropy],
                            feed_dict={x: batch_x, y: batch_y})
        avg_cost += c / total_batch
        print("Epoch:", (epoch + 1), "cost =", "{:.3f}".format(avg_cost))
    print(sess.run(accuracy, feed_dict={x: mnist.test.images, y: mnist.test.labels}))

Я использовал tf.random.set_random_seed(1234), чтобы что случайная инициализация каждого раунда одинакова (не уверен, что это можно сделать, но результаты согласованы на нескольких прогонах). При добавлении заполнителя стоимость для эпохи 1 будет равна 0,000, а при ее удалении стоимость будет составлять 0,001.

Хотя в этом простом примере конечная точность остается той же (точность = 0,9783), в В моем коде эта операция сильно влияет (добавление заполнителя фактически улучшает значение AU C для проблемы двоичной классификации). И если бы я изменил тип этого заполнителя, например, с заполнителя на sparse_placeholder, стоимость также изменилась бы (точность = 0,9772 в этом примере). Поэтому мне интересно, почему неиспользованный заполнитель также внес вклад в результат, и как я могу отладить такую ​​проблему?

Заранее спасибо! Любой может напрямую скопировать вставку и использовать python + name для запуска кода после установки TensorFlow 1.12+ и наблюдать за различиями, раскомментируя заполнитель zz или нет.

Plus: я вижу этот пост с похожей проблемой и читаю через https://github.com/tensorflow/tensorflow/issues/19171

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...