Функция порогового значения - градиенты для любой переменной не предусмотрены

1

То, что я пытаюсь достичь, - получить выходной слой нейронной сети, выполнить операцию порога после нормализации этого значения, а функция стоимости будет разницей в значении двоичного выходного уровня и моей метке класса. Я продолжаю получать вышеприведенную ошибку. Градиенты не предусмотрены для любой переменной.

Здесь Введите часть кода:

# Input and Expected Output of the neural networks
xs = tf.placeholder("float32", [None, n_features], name='XtoNN')
ys = tf.placeholder("float32", [None, 1], name='YfromNN')

# Hidden Layer
weightsH = tf.Variable(tf.truncated_normal([n_features, neurons_in_hlayer], mean=0,
                                     stddev=1 / np.sqrt(n_features)), name='weights1')
biasesH = tf.Variable(tf.truncated_normal([neurons_in_hlayer],mean=0, stddev=1 / np.sqrt(n_features)), name='biases1')
yValH = tf.nn.sigmoid(tf.add(tf.matmul(xs, weightsH),biasesH), name='activationLayer1')


# Output Layer
WeightsO = tf.Variable(tf.truncated_normal([neurons_in_hlayer, n_classes], mean=0, stddev = 1/np.sqrt(n_features)),
                                           name='weightsOut')
biasesO = tf.Variable(tf.truncated_normal([n_classes], mean=0, stddev=1 / np.sqrt(n_features)), name='biasesOut')
yPred = tf.cast(tf.add(tf.matmul(yValH, WeightsO), biasesO), tf.float32)

# Cost function
redYPred = tf.div(tf.subtract(yPred, tf.reduce_min(yPred)),
                  tf.subtract(tf.reduce_max(yPred), tf.reduce_min(yPred)))
binaryYPred = tf.cast(tf.to_int32(redYPred > tf.reduce_mean(redYPred)), tf.float32)
cost = tf.reduce_mean(tf.square(binaryYPred-ys, name='Cost'))

# Optimizer
train = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)

И сеанс модели:

startTime = datetime.now()
# Session
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    # sess.run(tf.local_variables_initializer())
    saver = tf.train.Saver()
    for i in range(training_epochs):
        for j in range(n_samples):
            # Run NN
            sess.run([cost, train], feed_dict={xs: X_train[j, :].reshape(1, n_features),
                                               ys: Y_train[j].reshape(1,n_classes)})
        currentEpochCost = sess.run(cost, feed_dict={xs: X_train, ys: Y_train})
        print('Epoch ', (i+1), ': Cost = ', currentEpochCost)

    timeTaken = datetime.now() - startTime
    print('Time Taken: ', timeTaken)

    yTestPredict = sess.run(binaryYPred, feed_dict={xs: X_test})
Теги:
tensorflow

1 ответ

0

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

Есть ли конкретная причина, по которой вы не можете использовать softmax для назначения вашего вывода одному из двух классов вывода? Там определенный смысл, в котором он делает то, что вы пытаетесь реализовать.

После того, как вы обучили сеть, и она выводит 97%, 3% для двух классов, она достаточно проста, чтобы бинаризовать выходы в тесте/времени использования.

  • 0
    Я пытаюсь получить двоичное значение, которое затем можно преобразовать в изображение, бинарное изображение значимости. Я новичок в Tensorflow и, насколько мне известно, softmax подразделяет значения на сумму 1. То, чего я пытаюсь добиться, это получить значение с плавающей запятой из нейронной сети, нормализовать его (нормализация минимального и максимального значений) и затем преобразовать его в двоичную форму, используя пороговое значение среднего значения, чтобы сравнить его с моим выходным двоичным изображением. Я не уверен, как этого добиться.
  • 0
    Не могли бы вы объяснить, что означает «недифференцируемая по своей сути операция»?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню