1

Ich trainiere ein autonomes faltendes neuronales Netzwerk in TensorFlow. Es ist ein einfaches Regressionsnetzwerk, das ein Bild aufnimmt und einen einzelnen Wert (einen Lenkwinkel) ausgibt.Trainiertes TensorFlow-Modell gibt immer Null aus

Dies ist die Funktion, in dem das Netzwerk definiert ist:

def cnn_model_fn(features, labels, mode): 
    conv1 = tf.layers.conv2d(
     inputs=features, 
     filters=32, 
     kernel_size=5, 
     padding="same", 
     activation=tf.nn.relu 
    ) 

    pool1 = tf.layers.max_pooling2d(
     inputs=conv1, 
     pool_size=2, 
     strides=2 
    ) 

    pool1_flat = tf.reshape(pool1, [-1, 2764800]) 

    dense1 = tf.layers.dense(
     inputs=pool1_flat, 
     units=128, 
     activation=tf.nn.relu 
    ) 

    dropout = tf.layers.dropout(
     inputs=dense1, 
     rate=0.4, 
     training=mode == learn.ModeKeys.TRAIN 
    ) 

    dense2 = tf.layers.dense(
     inputs=dropout, 
     units=1, 
     activation=tf.nn.relu 
    ) 

    predictions = tf.reshape(dense2, [-1]) 

    loss = None 
    train_op = None 

    if mode != learn.ModeKeys.INFER: 
     loss = tf.losses.mean_squared_error(
      labels=labels, 
      predictions=predictions 
     ) 

    if mode == learn.ModeKeys.TRAIN: 
     train_op = tf.contrib.layers.optimize_loss(
      loss=loss, 
      global_step=tf.contrib.framework.get_global_step(), 
      learning_rate=0.001, 
      optimizer="SGD" 
     ) 

    return model_fn_lib.ModelFnOps(
     mode=mode, 
     predictions=predictions, 
     loss=loss, 
     train_op=train_op 
    ) 

An anderer Stelle im Programm, initiieren ich die Ausbildung des Klassifikator wie so:

def main(_): 
    # Gather data 
    images, labels = get_data("./data/labels.csv") 

    # Create the estimator 
    classifier = learn.Estimator(
     model_fn=cnn_model_fn, 
     model_dir="/tmp/network2" 
    ) 

    # Train the model 
    classifier.fit(
     x=images, 
     y=labels, 
     batch_size=10, 
     steps=20 
    ) 

    for v in tf.trainable_variables(): 
     print(v) 

labels eine einfache eindimensionale NumPy ist enthält alle Lenkwinkel für die Trainingsbeispiele. Sie werden aus einer CSV-Datei gelesen. Die Werte in der Datei liegen ziemlich nahe bei 0 und haben einen Durchschnittswert um Null.

Wenn sie direkt aus der Datei gelesen oder mit einem Skalar multipliziert werden, konvergiert das Netzwerk relativ gut und erzielt eine Low-Loss-Funktion. Wenn ich eine Konstante hinzufüge, konvergiert sie nicht oder divergiert. Ich habe den Verdacht, dass alle Gewichte des Netzwerks auf Null konvergieren.

Hat jemand Probleme mit meiner Methodik?

Antwort

0

Das Regularisierung Dropout könnte die Ursache sein:

dropout = tf.layers.dropout(
     inputs=dense1, 
     rate=0.4, 
     training=mode == learn.ModeKeys.TRAIN 
    ) 

Was Sie beschreiben, in Ermangelung die Gewichte ausreichend konvergieren oder nahe Null fällt, ist sehr beschreibend für eine hoch Bias Problem. Das Entfernen oder Reduzieren des Grads der Regularisierung, das Hinzufügen weiterer Parameter zu Ihrem Netzwerk oder das Erhöhen der Varianz sind häufige Methoden, um dieses Problem zu beheben.

Verwandte Themen