Регрессия softmax Tensor Flow всегда предсказывает 1

У меня есть следующий код, основанный на примере MNIST. Модифицируется двумя способами:

1) Я не использую один горячий вектор, поэтому я просто использую tf.equal(y, y_)

2) Мои результаты двоичные: либо 0, либо 1

import tensorflow as tf
import numpy as np

# get the data
train_data, train_results = get_data(2000, 2014)
test_data, test_results = get_data(2014, 2015)

# setup a session
sess = tf.Session()

x_len = len(train_data[0])
y_len = len(train_results[0])

# make placeholders for inputs and outputs
x = tf.placeholder(tf.float32, shape=[None, x_len])
y_ = tf.placeholder(tf.float32, shape=[None, y_len])

# create the weights and bias
W = tf.Variable(tf.zeros([x_len, 1]))
b = tf.Variable(tf.zeros([1]))

# initialize everything
sess.run(tf.initialize_all_variables())

# create the "equation" for y in terms of x
y_prime = tf.matmul(x, W) + b
y = tf.nn.softmax(y_prime)

# construct the error function
cross_entropy = tf.nn.softmax_cross_entropy_with_logits(y_prime, y_)

# setup the training algorithm
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)

# train the thing
for i in range(1000):
    rand_rows = np.random.choice(train_data.shape[0], 100, replace=False)
    _, w_out, b_out, ce_out = sess.run([train_step, W, b, cross_entropy], feed_dict={x: train_data[rand_rows, :], y_: train_results[rand_rows, :]})

    print("%d: %s %s %s" % (i, str(w_out), str(b_out), str(ce_out)))

# compute how many times it was correct
correct_prediction = tf.equal(y, y_)

# find the accuracy of the predictions
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))

print(sess.run(accuracy, feed_dict={x: test_data, y_: test_results}))

for i in range(0, len(test_data)):
    res = sess.run(y, {x: [test_data[i]]})

    print("RES: " + str(res) + " ACT: " + str(test_results[i]))

Точность всегда равна 0,5 (поскольку в моих тестовых данных единиц примерно столько же, сколько нулей). Кажется, что значения W и b всегда увеличиваются, вероятно, потому, что значения cross_entropy всегда являются вектором всех нулей.

Когда я пытаюсь использовать эту модель для прогнозирования, прогнозы всегда равны 1:

RES: [[ 1.]] ACT: [ 0.]
RES: [[ 1.]] ACT: [ 1.]
RES: [[ 1.]] ACT: [ 0.]
RES: [[ 1.]] ACT: [ 1.]
RES: [[ 1.]] ACT: [ 0.]
RES: [[ 1.]] ACT: [ 1.]
RES: [[ 1.]] ACT: [ 0.]
RES: [[ 1.]] ACT: [ 0.]
RES: [[ 1.]] ACT: [ 1.]
RES: [[ 1.]] ACT: [ 0.]
RES: [[ 1.]] ACT: [ 1.]

Что я здесь делаю неправильно?


person wspeirs    schedule 16.12.2015    source источник


Ответы (1)


Кажется, вы предсказываете один скаляр, а не вектор. Операция softmax создает предсказание с векторным значением для каждого примера. Сумма этого вектора всегда должна равняться 1. Если вектор содержит только один элемент, этот элемент всегда должен быть равен 1. Если вы хотите использовать softmax для этой задачи, вы можете использовать [1, 0] в качестве цели вывода, где вы находитесь в данный момент. используя [0] и используйте [0, 1] там, где вы сейчас используете [1]. Другой вариант: вы можете продолжать использовать только одно число, но изменить выходной слой на сигмоид вместо softmax, а также изменить функцию стоимости на сигмовидную функцию стоимости.

person Ian Goodfellow    schedule 16.12.2015