Не работает сигмовидная функция тензорного потока

Я новичок в тензорном потоке и нейронных сетях.

В приведенном ниже коде все работает нормально. Однако как только я реализую функцию tf.sigmoid, раскомментировав # X21 = tf.sigmoid (X21); Я получаю странные результаты, где все мои прогнозы равны 1. Есть ли причина, по которой это может происходить?

Обратите внимание, что я прогнозирую цены на жилье в тысячах.

# Set model weights
b1_1 = tf.cast(tf.Variable(np.random.randn(), name = "bias"),tf.float64)
b1_2 = tf.cast(tf.Variable(np.random.randn(), name = "bias"),tf.float64)
b2_1 = tf.cast(tf.Variable(np.random.randn(), name = "bias"),tf.float64)

W1_1 = tf.cast(tf.Variable(np.random.randn(train_X.shape[1], 1), name = "bias"),tf.float64)
W1_2 = tf.cast(tf.Variable(np.random.randn(train_X.shape[1], 1), name = "bias"),tf.float64)
W2_1 = tf.cast(tf.Variable(np.random.randn(2, 1), name = "bias"),tf.float64)

X11 = tf.add(tf.matmul(train_X,W1_1),b1_1)
X12 = tf.add(tf.matmul(train_X,W1_2),b1_2)
X21 = tf.add(tf.matmul(tf.squeeze(tf.transpose(tf.stack((X11,X12)))),W2_1),b2_1)
#X21 = tf.sigmoid(X21)

# placeholders for a tensor that will be always fed.
Y = tf.placeholder('float64', shape = [47, 1])

cost = (tf.reduce_sum(tf.pow(X21-Y, 2))/(2*n_samples))
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)

# Initialize the variables (i.e. assign their default value)
init = tf.global_variables_initializer()

# Start training
with tf.Session() as sess:

    # Run the initializer
    sess.run(init)

    # Fit all training data
    for epoch in range(training_epochs):
        #for (x, y) in zip(train_X, train_Y):
        sess.run(optimizer, feed_dict = {Y: train_Y})
                # Display logs per epoch step
        if (epoch+1) % display_step == 0:
            c = sess.run(cost, feed_dict = {Y: train_Y})
            print("Epoch:", '%04d' % (epoch+1), "cost = ", "{:.9f}".format(c))

    print("Optimization Finished!")

    training_cost = sess.run(cost, feed_dict = {Y: train_Y})
    print("Training cost = ", training_cost)
    line = sess.run(X21,feed_dict = {Y: train_Y})

Сигмоидальная функция по своему определению производит значения от -1 до 1. И предназначена для использования с данными, нормализованными до значения от -1 до 1, потому что вне этого диапазона она асимптотически приближается либо к минимуму, либо к максимуму. Таким образом, если вы введете в него большие положительные значения, вы получите все единицы (или, скорее, почти единицы).

Mad Wombat 21.08.2018 19:00

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

Mad Wombat 21.08.2018 19:05

Мой плохой, tanh производит значения из (-1, 1), сигмоид производит (0, 1)

Mad Wombat 21.08.2018 19:06

О, да! Извини, у меня тоже плохо. Итак, мне нужно спрогнозировать цены на жилье, исходя из размера комнаты и площади. Как вы думаете, я могу улучшить прогнозы? В каких областях приведенного выше кода я могу поиграть, чтобы улучшить его?

Prince 22.08.2018 04:29

Ваш выходной слой не нуждается в функции активации (особенно, если вы собираетесь прогнозировать фактические цены). Но ваши скрытые слои могут выиграть. Попробуйте добавить сигмоид к X11 и X12 и оставить X21 как есть. Попробуйте переключиться с простого оптимизатора SGD на Adam или RPSProp. Другая идея - разделить цены, которые вы хотите спрогнозировать, на несколько ценовых категорий или классов и вместо того, чтобы пытаться предсказать точные цены, попытайтесь предсказать категорию.

Mad Wombat 22.08.2018 17:12

Большое спасибо за предложение. AdamOptimizer действительно работал. Раньше я постоянно недооценивал некоторые аспекты, но использование AdamOptimizer действительно решило проблему.

Prince 23.08.2018 05:18

Я пытаюсь понять, в чем разница между этими оптимизаторами и какой из них лучше всего использовать в той или иной ситуации. Я изучаю веб-сайт TF, но если вы знаете, где это объясняется лучше и понятнее, дайте мне знать. Кроме того, я попытался изменить скрытый слой с помощью сигмоида, но это дало все прогнозы как 1,422. Есть идеи, почему это может происходить?

Prince 23.08.2018 05:23
Udacity Nanodegree Capstone Project: Классификатор пород собак
Udacity Nanodegree Capstone Project: Классификатор пород собак
Вы можете ознакомиться со скриптами проекта и данными на github .
0
7
356
0

Другие вопросы по теме