Сложность с запуском градиентного спуска
Я построил нейронную сеть с Python в TensorFlow, но я не могу решить эту проблему с нетерпеливым выполнением TensorFlow. Все градиенты выдают ноль, и я не совсем уверен, где я ошибся в программе.
Первоначально я использовал ReLU, и я подумал, что это проблема в сети, поэтому я изменил его на негерметичный ReLU. Но не видел никаких изменений в градиентах.
import tensorflow as tf
# emabling eager execution
tf.enable_eager_execution()
# establising learning rate
LEARNING_RATE = 20
TRAINING_ITERATIONS = 30
LABELS = tf.constant([0.5, 0.7, 1.0])
# print(LABELS)
# input test vector
init = tf.Variable(tf.random_normal([3, 1]))
# print(init)
# declare and intialize all weights
weight1 = tf.Variable(tf.random_normal([2, 3]))
bias1 = tf.Variable(tf.random_normal([2, 1]))
weight2 = tf.Variable(tf.random_normal([3, 2]))
bias2 = tf.Variable(tf.random_normal([3, 1]))
weight3 = tf.Variable(tf.random_normal([2, 3]))
bias3 = tf.Variable(tf.random_normal([2, 1]))
weight4 = tf.Variable(tf.random_normal([3, 2]))
bias4 = tf.Variable(tf.random_normal([3, 1]))
weight5 = tf.Variable(tf.random_normal([3, 3]))
bias5 = tf.Variable(tf.random_normal([3, 1]))
VARIABLES = [weight1, bias1, weight2, bias2, weight3, bias3, weight4, bias4, weight5, bias5]
# print(weight1)
def neuralNet(input, y_input): # nn model aka: Thanouse's Eyes
layerResult = tf.nn.leaky_relu((tf.matmul(weight1, input) + bias1), alpha=0.1)
input = layerResult
layerResult = tf.nn.leaky_relu((tf.matmul(weight2, input) + bias2), alpha=0.1)
input = layerResult
layerResult = tf.nn.leaky_relu((tf.matmul(weight3, input) + bias3), alpha=0.1)
input = layerResult
layerResult = tf.nn.leaky_relu((tf.matmul(weight4, input) + bias4), alpha=0.1)
input = layerResult
layerResult = tf.nn.leaky_relu((tf.matmul(weight5, input) + bias5), alpha=0.1)
prediction = tf.nn.softmax(tf.reshape(layerResult, [-1]))
return prediction
# print(neuralNet(init, LABELS))
# Begin training and update variables
optimizer = tf.train.AdamOptimizer(learning_rate=LEARNING_RATE)
for i in range(TRAINING_ITERATIONS):
with tf.GradientTape(persistent=True) as tape: # gradient calculation
tape.watch(VARIABLES)
COST = tf.reduce_sum(LABELS - neuralNet(init, LABELS))
print(COST)
GRADIENTS = tape.gradient(COST, VARIABLES)
# print(GRADIENTS)
optimizer.apply_gradients(zip(GRADIENTS, VARIABLES))
1 ответ
Вам не нужно persistent
GradientTape. Просто убери аргумент.
Фактическая проблема заключается в том, что производная от sum(softmax)
просто всегда равен нулю, потому что, по определению, сумма выходов softmax всегда равна 1. Итак, что бы вы ни делали со своими переменными, вы не сможете уменьшить COST, который вы определили.