То, что я пытаюсь достичь, - получить выходной слой нейронной сети, выполнить операцию порога после нормализации этого значения, а функция стоимости будет разницей в значении двоичного выходного уровня и моей метке класса. Я продолжаю получать вышеприведенную ошибку. Градиенты не предусмотрены для любой переменной.
Здесь Введите часть кода:
# 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})
Это происходит потому, что вы добавляете в свои вычисления неотрицательную операцию (жесткий порог). Поскольку порог не имеет градиента, нет никакого градиента для backprop через вашу сеть.
Есть ли конкретная причина, по которой вы не можете использовать softmax для назначения вашего вывода одному из двух классов вывода? Там определенный смысл, в котором он делает то, что вы пытаетесь реализовать.
После того, как вы обучили сеть, и она выводит 97%, 3% для двух классов, она достаточно проста, чтобы бинаризовать выходы в тесте/времени использования.