Tensorflow Python:完成训练的DNN回归模型,多次执行后,预测会发生巨大变化

时间:2019-07-07 22:57:40

标签: python tensorflow

我正在使用Tensorflow Python,并且正在使用DNN回归模型来训练一些鲍鱼数据。 (https://archive.ics.uci.edu/ml/datasets/Abalone

为了确保清楚,我正在使用Jupyter,因此我实质上是在Ipython shell中进行编程,因此它使我能够执行某些代码行而无需运行整个脚本。

出现的问题是,即使我已经完全训练了模型。我想根据一些测试数据预测一些值。 我运行了一次,它向我显示了预测和目标,但是如果我再次运行该代码(我正在使用Jupyter),它将打印出截然不同的值。 有时打印负值,或者有时将所有预测打印为0。

还要注意,我从Google Crash课程中学到了TensorFlow,该课程包含一些过时的代码,但是我将一些相关的代码更新为较新的标准。

我的代码中也有一个线性回归模型,它似乎运行良好。训练后,我会根据一些测试数据预测一些值,如果我重新运行该代码块,它将预测相同的值。

还要注意,两个模型都说它们在临时目录中运行,但是只有线性回归模型实际上在指定的临时方向上写东西,而DNN回归根本不写任何东西,而是经过适当训练(即使指定了model_dir,也仍然什么也没写,所以我认为这是正确的行为?)。

培训代码

def train_dnn_regression_model(
    learning_rate,
    regularization_strength,
    steps,
    batch_size,
    hidden_units,
    feature_columns,
    training_examples,
    training_targets,
    validation_examples,
    validation_targets,
    ):

    periods = 10
    steps_per_period = steps / periods

    #Initialize DNN Regressor
    optimizer = tf.train.FtrlOptimizer(learning_rate=learning_rate, l1_regularization_strength=regularization_strength)
    optimizer = tf.contrib.estimator.clip_gradients_by_norm(optimizer, 5.0)
    dnn_regressor = tf.estimator.DNNRegressor(
        feature_columns=feature_columns,
        hidden_units=hidden_units,
        optimizer=optimizer,
        activation_fn=tf.nn.leaky_relu
    )

    #Training Functions
    training_input_fn = lambda: input_fn(
        training_examples,
        training_targets,
        batch_size=batch_size) 
    predict_training_input_fn = lambda: input_fn(
        training_examples, 
        training_targets, 
        num_epochs=1, 
        shuffle=False)

    #Validation Function
    predict_validation_input_fn = lambda: input_fn(
        validation_examples, 
        validation_targets, 
        num_epochs=1, 
        shuffle=False)

    #Train Model
    training_rmse = []
    validation_rmse = []

    print("Training Model")
    for period in range(0, periods):
        linear_regressor.train(
            input_fn=training_input_fn,
            #Manually break total steps by 10
            steps=steps_per_period
        )

        #Use Sklearn to calculate RMSE
        training_predictions = linear_regressor.predict(input_fn=predict_training_input_fn)
        training_predictions = np.array([item['predictions'][0] for item in training_predictions])
        training_root_mean_squared_error = math.sqrt(metrics.mean_squared_error(training_predictions, training_targets))

        #Calculate Validation RMSE
        validation_predictions = linear_regressor.predict(input_fn=predict_validation_input_fn)
        validation_predictions = np.array([item['predictions'][0] for item in validation_predictions])
        validation_root_mean_squared_error = math.sqrt(metrics.mean_squared_error(validation_predictions, validation_targets))

        #Append Losses
        training_rmse.append(training_root_mean_squared_error)
        validation_rmse.append(validation_root_mean_squared_error)

        print("Period:", period, "RMSE:", training_root_mean_squared_error)
    print("Training Finished")

    #Graph
    plt.ylabel("RMSE")
    plt.xlabel("Periods")
    plt.title("Root Mean Squared Error vs. Periods")
    plt.tight_layout()
    plt.plot(training_rmse, label="training")
    plt.plot(validation_rmse, label="validation")
    plt.legend()

    return dnn_regressor

打印预测值和标签

def test_regression_model(model, test_examples, test_targets):
    predict_test_input_fn = lambda: input_fn(
        test_examples, 
        test_targets, 
        num_epochs=1, 
        shuffle=False)

    test_predictions = model.predict(input_fn=predict_test_input_fn)
    test_predictions = np.array([item['predictions'][0] for item in test_predictions])

    for prediction, label in zip(test_predictions, test_targets): 
        print("Prediction:", prediction, "Label:", label, "Diff:", abs(prediction - label))

    return test_predictions

输出非常不同结果的代码

#DNN Regressor
test_predictions_dnn_regressor = test_regression_model(dnn_regressor, test_examples, test_targets)
test_rmse_dnn_regressor = math.sqrt(metrics.mean_squared_error(test_predictions_dnn_regressor, test_targets))
print("Test RMSE:", test_rmse_dnn_regressor)

我希望显示出一些积极的结果,这些结果在标记为“输出非常不同的结果的代码”的代码的多次执行中是一致的,以便我可以适当地诊断模型!

0 个答案:

没有答案
相关问题