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?