同一代码在Jupyter Notebook拆分单元格后无法正常运行的问题
Jupyter Notebook拆分单元格后TensorFlow预测结果为空的原因分析
问题场景
将以下代码放在单个Jupyter单元格内运行时,能正常输出TensorFlow日志和符合预期的pandas Series结果:
train_predictions = linear_model.predict(train_feed_input_testing) test_predictions = linear_model.predict(test_feed_input) train_predictions_series = pd.Series([p['predictions'][0] for p in train_predictions]) test_predictions_series = pd.Series([p['predictions'][0] for p in test_predictions]) train_predictions_series, test_predictions_series
但将代码拆分到多个独立单元格后,单独执行train_predictions_series = pd.Series([p['predictions'][0] for p in train_predictions])并查看该对象时,得到的是空Series:
Series([], dtype: float64)
核心原因
这是因为TensorFlow的predict()方法返回的是一次性迭代的生成器/数据流对象:
- 在同一单元格内运行时,
train_predictions会被直接用于后续的列表推导,一次性完成迭代并转换为Series,数据没有被提前消耗。 - 拆分单元格后,第一次运行
train_predictions = linear_model.predict(...)时,Jupyter的自动变量展示机制会隐式遍历这个生成器对象(比如在单元格输出里显示其内容),导致生成器被耗尽。后续再执行列表推导时,已经没有数据可以遍历,最终生成空Series。 - 另外,当输入的
train_feed_input_testing是tf.data.Dataset这类数据流时,predict()返回的结果本身就是只能迭代一次的对象,无法重复读取。
解决办法
- 提前将预测结果转换为持久化的列表,确保数据存在内存中可重复使用:
转换为列表后,无论拆分多少单元格,重复迭代都不会出现空数据的情况。train_predictions = list(linear_model.predict(train_feed_input_testing)) test_predictions = list(linear_model.predict(test_feed_input)) - 如需查看
train_predictions的内容,避免直接输出变量(会触发全量遍历),可以只查看前几个元素:print(train_predictions[:5])
内容的提问来源于stack exchange,提问作者SREE SHARON SIVAKUMAR
相关产品推荐
相关产品推荐

