keras 警告::tensorflow:最近5次调用中有5次在机器学习速成课程中触发了tf.function回溯Developers.google

4ioopgfo  于 2023-06-06  发布在  Go
关注(0)|答案(1)|浏览(227)

我正在关注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的跟踪/回溯会导致更严重的问题吗?

iklwldmw

iklwldmw1#

当我在Google Colab中尝试复制相同的错误时,上面给出的代码没有显示任何警告。(请找到此复制的gist)。
您可以尝试在定义自定义函数之前使用@tf.function(experimental_relax_shapes=True),该函数试图检测并避免不必要的回溯,或者尝试在导入tensorflow之后使用代码tf.compat.v1.disable_eager_execution()禁用即时执行。
请看看这个类似的issue供您参考。

相关问题