Entrenamiento TensorFlow


Asumiendo que tengo una red neuronal muy simple, como perceptrón multicapa. Para cada capa la función de activación es sigmoid y la red está completamente conectada.

En TensorFlow esto podría definirse así:

    sess = tf.InteractiveSession()

    # Training Tensor
    x = tf.placeholder(tf.float32, shape = [None, n_fft])
    # Label Tensor
    y_ = tf.placeholder(tf.float32, shape = [None, n_fft])

    # Declaring variable buffer for weights W and bias b
    # Layer structure [n_fft, n_fft, n_fft, n_fft]
    # Input -> Layer 1
    struct_w = [n_fft, n_fft]
    struct_b = [n_fft]
    W1 = weight_variable(struct_w, 'W1')
    b1 = bias_variable(struct_b, 'b1')
    h1 = tf.nn.sigmoid(tf.matmul(x, W1) + b1)

    # Layer1 -> Layer 2
    W2 = weight_variable(struct_w, 'W2')
    b2 = bias_variable(struct_b, 'b2')
    h2 = tf.nn.sigmoid(tf.matmul(h1, W2) + b2)

    # Layer2 -> output
    W3 = weight_variable(struct_w, 'W3')
    b3 = bias_variable(struct_b, 'b3')
    y = tf.nn.sigmoid(tf.matmul(h2, W3) + b3)

    # Calculating difference between label and output using mean square error
    mse = tf.reduce_mean(tf.square(y - y_))

    # Train the Model
    # Gradient Descent
    train_step = tf.train.GradientDescentOptimizer(0.3).minimize(mse)

El objetivo de diseño para este modelo es mapear un espectrograma fft de puntos n_fft a otro espectrograma objetivo n_fft. Supongamos que tanto los datos de entrenamiento como los datos de destino son de tamaño [3000, n_fft]. Se almacenan en variables spec_train y spec_target.

Ahora aquí viene la pregunta. Para TensorFlow, ¿hay alguna diferencia entre estos dos entrenamientos?

Entrenamiento 1:

for i in xrange(200):
        train_step.run(feed_dict = {x: spec_train, y_: spec_target})

Entrenamiento 2:

for i in xrange(200):
        for j in xrange(3000):
            train = spec_train[j, :].reshape(1, n_fft)
            label = spec_target[j, :].reshape(1, n_fft)
            train_step.run(feed_dict = {x: train, y_: label})

Muchas Gracias!

Author: Engineero, 2015-12-05

2 answers

En la primera versión de entrenamiento, está entrenando todo el lote de datos de entrenamiento a la vez, lo que significa que el primer y el elemento 3000 de spec_train se procesarán utilizando los mismos parámetros del modelo en un solo paso. Esto se conoce como (Lote) Descenso de Gradiente.

En la segunda versión de entrenamiento, está entrenando un solo ejemplo a partir de los datos de entrenamiento a la vez, lo que significa que el elemento 3000 de spec_train se procesará utilizando parámetros del modelo que se han actualizado 2999 veces desde que el primer elemento fue procesado más recientemente. Esto se conoce como Descenso del Gradiente Estocástico (o lo sería si el elemento se seleccionara al azar).

En general, TensorFlow se utiliza con conjuntos de datos que son demasiado grandes para procesarlos en un solo lote, por lo que se favorece el mini-lote SGD (donde un subconjunto de los ejemplos se procesan en un solo paso). Procesar un solo elemento a la vez es teóricamente deseable, pero es inherentemente secuencial y tiene altos costos fijos porque las multiplicaciones matriciales y otras operaciones no son tan densas computacionalmente. Por lo tanto, procesar un pequeño lote (por ejemplo, 32 o 128) de ejemplos a la vez es el enfoque habitual, con múltiples réplicas de entrenamiento en diferentes lotes en paralelo.

Vea esta pregunta Stats StackExchange para una discusión más teórica de cuándo debe usar un enfoque versus el otro.

 36
Author: mrry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-13 12:44:14

Sí hay una diferencia. Creo que la función de pérdida de la segunda forma puede ser un poco desordenada. Es más como entrenamiento en línea. Para cada punto de datos en todo el lote se actualizan todos los parámetros. Pero en la primera forma se llama el gradiente de lote donde se toma un lote a la vez y tomar la pérdida media a continuación, actualizar los parámetros.

Por favor, consulte este enlace https://stats.stackexchange.com/questions/49528/batch-gradient-descent-versus-stochastic-gradient-descent La primera respuesta es muy buena en este enlace

 0
Author: Shamane Siriwardhana,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-13 12:44:17