1. gradiente tensorflow resuelto de varias maneras
1.1 tf.gradients
tf.gradients(
ys,
xs,
grad_ys=None,
name='gradients',
colocate_gradients_with_ops=False,
gate_gradients=False,
aggregation_method=None,
stop_gradients=None,
unconnected_gradients=tf.UnconnectedGradients.NONE
)
Gradiente xs ys en los resultados calculados tf.gradients devuelve una longitud len (XS) de la lista lista tensor, por ejemplo
tf.gradients(y, [x1, x2, x3]返回[dy/dx1, dy/dx2, dy/dx3]
Cuando y es independiente de x, es decir, el camino de X a Y ningún gráfico, la búsqueda de la pendiente y de x retorno de la [Ninguno]; parámetro stop_gradients
variable especificada para resolver para el gradiente de corriente, una parada de gradiente en la solución de estas variables.
a = tf.constant(0.)
b = 2 * a
g = tf.gradients(a + b, [a, b], stop_gradients=[a, b]) #梯度计算不再追溯a,b之前的变量
salida:
In: sess.run(g)
out:[1.0, 1.0]
Si el parámetro no está establecido stop_gradients de cálculo de gradiente de retropropagación se remonta a los principios del valor a, la salida es:
In : sess.run(g)
Out: [3.0, 1.0]
1.2 optimizer.compute_gradients
compute_gradients(
loss,
var_list=None,
gate_gradients=GATE_OP,
aggregation_method=None,
colocate_gradients_with_ops=False,
grad_loss=None
)
optimizer.compute_gradients
Un tf.gradients
paquete, el mismo efecto, pero sólo devuelve las variables gradiente tfgradients, compute_gradients gradiente y de retorno derivables; tf.compute_gradients optimizer.minimize primer paso () es, optimizer.compute_gradients devuelve un [(gradiente, variables), ... ] la lista de tuplas , donde el gradiente es un tensor. Intuitivamente, optimizer.compute_gradients sólo una más de las variables de salida tf.gradients.
optimizer = tf.train.GradientDescentOptimizer(learning_rate = 1.0)
self.train_op = optimizer.minimize(self.cost)
sess.run([train_op], feed_dict={x:data, y:labels})
En este proceso, cuando el método de llamar a minimizar, para trabajar los comprende de fondo:
(1) utilizando el gradiente calculado para todos los parámetros tf.optimizer.compute_gradients trainable_variables conjunto
(2) utilizando una actualización optimizer.apply_gradients pendiente correspondiente variable calculada
el código anterior es equivalente a la de código siguiente
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.1)
grads_and_vars = optimizer.compute_gradients(loss)
train_op = optimizer.apply_gradients(grads_and_vars)
1.3 tf.stop_gradient
tf.stop_gradient(
input,
name=None
)
variables de entrada tf.stop_gradient Evitar que intervienen en el cálculo de la pendiente, es decir, antes de escudo gráfico de entrada durante el cálculo del gradiente.
Devuelve: gradiente de entrada acerca
2. El gradiente de corte
Si queremos gradiente de corte, el gradiente es necesario calcular su propia cuenta, y luego cortar, y finalmente se aplica al código variable mostrada más abajo, a continuación, presentamos uno de los pasos más importantes en la que
#return a list of trainable variable in you model
params = tf.trainable_variables()
#create an optimizer
opt = tf.train.GradientDescentOptimizer(self.learning_rate)
#compute gradients for params
gradients = tf.gradients(loss, params)
#process gradients
clipped_gradients, norm = tf.clip_by_global_norm(gradients,max_gradient_norm)
train_op = opt.apply_gradients(zip(clipped_gradients, params)))
Introducción 2.1 tf.clip_by_global_norm
tf.clip_by_global_norm(t_list, clip_norm, use_norm=None, name=None)
t_list 表示梯度张量
clip_norm是截取的比率
Después de la aplicación de esta función, t_list [i] se convierte actualización pública:
global_norm = sqrt(sum(l2norm(t)**2 for t in t_list))
t_list[i] = t_list[i] * clip_norm / max(global_norm, clip_norm)
Se divide en dos etapas:
(1) calcula el cuadrado todos los gradientes y global_norm
(2) si el gradiente de la plaza y excede nuestra global_norm especificada clip_norm, a continuación, hacer un zoom en el gradiente, de lo contrario, de acuerdo con los resultados originales
Ejemplo gradiente de 2 Crop
loss = w*x*x
optimizer = tf.train.GradientDescentOptimizer(0.1)
grads_and_vars = optimizer.compute_gradients(loss,[w,x])
grads = tf.gradients(loss,[w,x])
# 修正梯度
for i,(gradient,var) in enumerate(grads_and_vars):
if gradient is not None:
grads_and_vars[i] = (tf.clip_by_norm(gradient,5),var)
train_op = optimizer.apply_gradients(grads_and_vars)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print(sess.run(grads_and_vars))
# 梯度修正前[(9.0, 2.0), (12.0, 3.0)];梯度修正后 ,[(5.0, 2.0), (5.0, 3.0)]
print(sess.run(grads)) #[9.0, 12.0],
print(train_op)