【问题标题】:Trained TensorFlow model always outputs zero经过训练的 TensorFlow 模型始终输出为零
【发布时间】:2017-07-05 17:47:39
【问题描述】:

我正在 TensorFlow 中训练一个自动驾驶卷积神经网络。它是一个简单的回归网络,获取图像并输出单个值(转向角)。

这是定义网络的函数:

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
    )

在程序的其他地方,我像这样启动分类器的训练:

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 是一个简单的一维 NumPy,包含训练示例的所有转向角。它们是从 CSV 文件中读取的。文件中的值非常接近 0,平均值约为 0。

当它们直接从文件中读取或乘以标量时,网络收敛得相当好,并实现了低损失函数。当我添加一个常数时,它无法收敛或发散。我怀疑网络的所有权重都收敛于零。

有人发现我的方法有什么问题吗?

【问题讨论】:

    标签: python numpy machine-learning tensorflow conv-neural-network


    【解决方案1】:

    dropout 正则化可能是罪魁祸首:

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

    您所描述的,权重未能充分收敛或接近零,高度描述了 高偏差 问题。移除或降低正则化程度、向网络添加更多参数或以其他方式增加方差是解决此类问题的常用方法。

    【讨论】:

      猜你喜欢
      • 2018-05-17
      • 1970-01-01
      • 2018-08-13
      • 1970-01-01
      • 2019-06-25
      • 2022-12-10
      • 1970-01-01
      • 2020-06-27
      • 1970-01-01
      相关资源
      最近更新 更多