Estoy usando TensorFlow para entrenar una red neuronal. Así es como estoy inicializando GradientDescentOptimizer
:
init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)
mse = tf.reduce_mean(tf.square(out - out_))
train_step = tf.train.GradientDescentOptimizer(0.3).minimize(mse)
El problema aquí es que no sé cómo establecer una regla de actualización para la tasa de aprendizaje o un valor de caída para eso.
¿Cómo puedo usar una tasa de aprendizaje adaptativo aquí?
python
tensorflow
nombre para mostrar
fuente
fuente
FailedPreconditionError (see above for traceback): Attempting to use uninitialized value beta2_power
tf.train.GradientDescentOptimizer(new_lr).minimize(loss)
. Parece que establecer una nueva tasa de aprendizaje requiere inicializar el modelo con las variables ya entrenadas. Pero no puedo averiguar cómo hacer eso.Respuestas:
En primer lugar,
tf.train.GradientDescentOptimizer
está diseñado para utilizar una tasa de aprendizaje constante para todas las variables en todos los pasos. TensorFlow también proporciona optimizadores adaptativos listos para usar, incluidos eltf.train.AdagradOptimizer
y eltf.train.AdamOptimizer
, y estos se pueden usar como reemplazos directos.Sin embargo, si desea controlar la tasa de aprendizaje con un descenso de gradiente de otro modo vainilla, puede aprovechar el hecho de que el
learning_rate
argumento para eltf.train.GradientDescentOptimizer
constructor puede ser unTensor
objeto. Esto le permite calcular un valor diferente para la tasa de aprendizaje en cada paso, por ejemplo:Alternativamente, puede crear un escalar
tf.Variable
que contenga la tasa de aprendizaje y asignarlo cada vez que desee cambiar la tasa de aprendizaje.fuente
tf.clip_by_norm
no acepta un tensor para la norma del clip, entonces, ¿qué tal si[(tf.minimum(gv[0], ct), gv[1]) for gv in optimizer.compute_gradients(cost, vars)]
, dóndect = tf.placeholder('float32', shape=[])
tf.clip_by_norm
, lo único que impide que acepte un tensor como entrada es laconstant_op.constant(1.0 / clip_norm)
sustitución de esa expresión con.math_ops.inv(clip_norm)
Sería hacer que funcione con un marcador de posición (o cualquier otro tensor) de entrada.)Tensorflow proporciona un artículo para aplicar automáticamente un decaimiento exponencial a un tensor velocidad de aprendizaje:
tf.train.exponential_decay
. Para ver un ejemplo en uso, consulte esta línea en el ejemplo del modelo convolucional MNIST . Luego, use la sugerencia de @ mrry anterior para proporcionar esta variable como el parámetro learning_rate a su optimizador de elección.El extracto clave para mirar es:
Tenga en cuenta el
global_step=batch
parámetro para minimizar. Eso le dice al optimizador que incremente de manera útil el parámetro 'lote' cada vez que entrena.fuente
batch
llamaglobal_step
y hay varias funciones de conveniencia, una para crearlatf.train.create_global_step()
(que simplemente crea un número enterotf.Variable
y lo agrega a latf.GraphKeys.GLOBAL_STEP
colección) ytf.train.get_global_step()
.El algoritmo de descenso de gradiente utiliza la tasa de aprendizaje constante que puede proporcionar durante la inicialización . Puede aprobar varias tasas de aprendizaje de la manera que muestra Mrry.
Pero en lugar de eso, también puede usar optimizadores más avanzados que tienen una tasa de convergencia más rápida y se adaptan a la situación.
Aquí hay una breve explicación basada en mi entendimiento:
Adam o el impulso adaptativo es un algoritmo similar a AdaDelta. Pero además de almacenar tasas de aprendizaje para cada uno de los parámetros, también almacena los cambios de impulso para cada uno de ellos por separado.
A pocos visualizaciones :
fuente
De los documentos oficiales de tensorflow
fuente
Si desea establecer tasas de aprendizaje específicas para intervalos de épocas como
0 < a < b < c < ...
. Luego, puede definir su tasa de aprendizaje como un tensor condicional, condicional en el paso global, y alimentar esto de forma normal al optimizador.Puede lograr esto con un montón de
tf.cond
declaraciones anidadas , pero es más fácil construir el tensor de forma recursiva:Luego, para usarlo, debe saber cuántos pasos de entrenamiento hay en una sola época, de modo que podamos usar el paso global para cambiar en el momento adecuado y, finalmente, definir las épocas y las tasas de aprendizaje que desee. Entonces, si quiero las tasas de aprendizaje
[0.1, 0.01, 0.001, 0.0001]
durante los intervalos de época de[0, 19], [20, 59], [60, 99], [100, \infty]
respectivamente, haría:fuente