我正在使用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)
我希望显示出一些积极的结果,这些结果在标记为“输出非常不同的结果的代码”的代码的多次执行中是一致的,以便我可以适当地诊断模型!