我正在关注Google持有的“Introduction to Machine Learning Crash Course”。
Keras和Tensorflow用于编码练习。在线性回归的一个开始练习中,我有这样一个代码,其中创建了一个仅使用1个变量的简单线性回归模型。
training_df = pd.read_csv(filepath_or_buffer="https://download.mlcc.google.com/mledu-datasets/california_housing_train.csv")
training_df["median_house_value"] /= 1000
def build_model(my_learning_rate):
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Dense(units=1, input_shape=(1, )))
model.compile(optimizer=tf.keras.optimizers.RMSprop(lr=my_learning_rate),
loss="mean_squared_error", metrics=[tf.keras.metrics.RootMeanSquaredError()])
return model
def train_model(model, df, feature, label, epochs, batch_size):
history = model.fit(x = df[feature],
y = df[label],
batch_size = batch_size,
epochs = epochs)
trained_weight = model.get_weights()[0]
trained_bias = model.get_weights()[1]
epochs = history.epoch
hist = pd.DataFrame(history.history)
rmse = hist["root_mean_squared_error"]
return trained_weight, trained_bias, epochs, rmse
def plot_the_model(trained_weight, trained_bias, feature, label):
plt.xlabel("feature")
plt.ylabel("label")
random_examples = training_df.sample(n=200)
plt.scatter(random_examples[feature], random_examples[label])
x0 = 0
y0 = trained_bias
x1 = random_examples[feature].max()
y1 = trained_bias + (trained_weight * x1)
plt.plot([x0, x1], [y0, y1], c="r")
plt.show()
def plot_the_loss_curve(epochs, rmse):
plt.figure()
plt.xlabel("Epoch")
plt.ylabel("Root MSE")
plt.plot(epochs, rmse, label="Loss")
plt.legend()
plt.ylim([rmse.min()*0.97, rmse.max()])
plt.show()
我们定义这些函数来创建模型、训练模型、绘制模型和绘制损失。
为了使用模型进行预测,我们定义了最后一个函数来进行实际预测。
然后我选择超参数,并创建一个合成特征来进行预测。
def predict_house_values(n, feature, label):
# predict house value based on a feature
batch = training_df[feature][10000:10000+n]
predicted_values = my_model.predict_on_batch(x=batch)
print("feature label predicted")
print("value value value")
print(" in thousand in thousand")
print("----------------------------------------")
for i in range(n):
print("%5.0f %6.0f %15.0f" % (training_df[feature][10000 + i],
training_df[label][10000 + i],
predicted_values[i][0] ))
training_df["rooms_per_person"] = training_df["total_rooms"] / training_df["population"]
my_feature = "rooms_per_person"
my_label = "median_house_value"
learning_rate = 0.01
epochs = 50
batch_size = 30
my_model = build_model(learning_rate)
weight, bias, epochs, rmse = train_model(my_model, training_df,
my_feature, my_label,
epochs, batch_size)
plot_the_loss_curve(epochs, rmse)
plot_the_model(weight, bias, my_feature, my_label)
predict_house_values(15, my_feature, my_label)
我运行最后一个代码块,使用room_per_person
特性预测median_house_value
。
一切正常,但出现警告。
警告:tensorflow:最近5次调用触发的tf.函数回溯中有5次。跟踪是昂贵的,过多的跟踪次数可能是由于(1)在循环中重复创建@tf.function,(2)传递不同形状的Tensor,(3)传递Python对象而不是Tensor。对于(1),请在循环外定义@tf.函数。对于(2),@tf.function具有reduce_retracing=True选项,可以避免不必要的回溯。对于(3),请参阅https://www.tensorflow.org/guide/function#controlling_retracing和https://www.tensorflow.org/api_docs/python/tf/function了解更多详细信息。
我认为问题可能在predict_house_values
函数内部的for
循环中,但我不确定。如何改进代码以避免收到此警告?在更复杂的问题中,tf.function
的跟踪/回溯会导致更严重的问题吗?
1条答案
按热度按时间iklwldmw1#
当我在Google Colab中尝试复制相同的错误时,上面给出的代码没有显示任何警告。(请找到此复制的gist)。
您可以尝试在定义自定义函数之前使用
@tf.function(experimental_relax_shapes=True)
,该函数试图检测并避免不必要的回溯,或者尝试在导入tensorflow之后使用代码tf.compat.v1.disable_eager_execution()
禁用即时执行。请看看这个类似的issue供您参考。