web-dev-qa-db-fra.com

Entraînement TensorFlow

En supposant que j'ai un réseau de neurones très simple, comme un perceptron multicouche. Pour chaque couche, la fonction d'activation est sigmoïde et le réseau est entièrement connecté.

Dans TensorFlow, ceci pourrait être défini comme suit:

    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)

L'objectif de conception de ce modèle est de mapper un spectrogramme n_fft points fft sur un autre spectrogramme cible n_fft. Supposons que les données d'apprentissage et les données cibles sont de taille [3000, n_fft]. Ils sont stockés dans les variables spec_train et spec_target.

Maintenant, voici la question. Y a-t-il une différence entre ces deux formations pour TensorFlow?

Formation 1:

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

Formation 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})

Merci beaucoup!

27
yc2986

Dans la première version d'apprentissage, vous entraînez le lot complet de données d'apprentissage en une fois, ce qui signifie que le premier et le 3 000e élément de spec_train seront traités à l'aide des mêmes paramètres de modèle en une seule étape. Ceci est appelé (Lot) Gradient Descent.

Dans la deuxième version d'apprentissage, vous entraînez simultanément un seul exemple à partir des données d'apprentissage, ce qui signifie que le 3 000e élément de spec_train sera traité à l'aide de paramètres de modèle mis à jour 2999 fois depuis le dernier traitement. Cela s'appelle descente de gradient stochastique (ou si l'élément était sélectionné au hasard).

En général, TensorFlow est utilisé avec des jeux de données trop volumineux pour être traités en un lot. Par conséquent, le SGD en mini-lot (dans lequel un sous-ensemble des exemples est traité en une étape) est privilégié. Le traitement d'un seul élément à la fois est théoriquement souhaitable, mais il est intrinsèquement séquentiel et présente des coûts fixes élevés car les multiplications de matrice et les autres opérations ne sont pas aussi denses en calcul. Par conséquent, le traitement d’un petit lot (par exemple, 32 ou 128) à la fois est l’approche habituelle, avec plusieurs répliques formant en parallèle sur différents lots.

Voir la question Stats StackExchange pour une discussion plus théorique du moment où vous devriez utiliser une approche par rapport à l’autre.

36
mrry

Oui il y a une différence. Je pense que la fonction de perte de la deuxième manière peut être un peu compliquée. C'est plus comme une formation en ligne. Pour chaque point de données du lot entier, vous mettez à jour tous vos paramètres. Mais dans un premier temps, on parle de gradient de lot. Vous prenez un lot à la fois et prenez la perte moyenne, puis mettez à jour les paramètres. 

Veuillez vous référer à ce lien https://stats.stackexchange.com/questions/49528/batch-gradient-descent-versus-stochastic-gradient-descent .__ dans ce lien

0