基于TensorFlow后端的Keras:如何识别计算图中的变量(张量)
解决Jupyter Notebook中跳过预处理、直接从训练阶段重启的方案
嘿,我太懂你这种不想反复跑耗时预处理的心情了——毕竟每次等预处理跑完真的很磨人,哪怕加载预处理后的数据都要花不少时间。针对你在Python 3.6的Jupyter Notebook里的需求,我整理了几个实用的办法:
方案1:利用Jupyter内核的变量持久化(最简单)
Jupyter的内核在运行时会把所有变量保存在内存里,只要你不重启内核,这些变量就一直存在。具体操作:
- 先完整跑一遍所有预处理单元格,把预处理好的数据(比如
train_X、train_y、验证集数据等)存在全局变量里。 - 之后每次想从训练阶段重新运行时,直接从训练的第一个单元格开始执行就行,不用碰预处理的单元格。
- 放心,你训练单元格里的
K.clear_session()只会清除Keras的会话、模型、计算图这些内容,完全不会删掉你已经存在的预处理数据变量。 - 小提示:可以给预处理单元格加个醒目的注释,比如
# 🚀 仅首次运行:数据预处理模块,避免不小心重复运行。
方案2:用joblib快速序列化数据(适合需要重启内核的情况)
如果有时候不得不重启内核,又不想重新跑预处理,那用joblib序列化数据比普通的文件加载快很多,尤其是处理大数组的时候:
- 预处理完成后,在单独的单元格里保存数据:
import joblib # 把所有需要的预处理数据打包保存 joblib.dump((train_X, train_y, val_X, val_y), 'preprocessed_data.pkl') - 在训练阶段的第一个单元格里,先判断文件是否存在,存在就直接加载,再执行
K.clear_session():import joblib import os # 优先加载已保存的预处理数据 if os.path.exists('preprocessed_data.pkl'): train_X, train_y, val_X, val_y = joblib.load('preprocessed_data.pkl') else: # 万一没保存的话,再跑预处理(可选,根据你的情况调整) pass # 清除Keras旧会话,准备训练 from keras import backend as K K.clear_session()
方案3:用Jupyter魔术命令%store(跨会话快速加载)
Jupyter自带的%store命令可以跨会话保存变量,重启内核甚至关闭Notebook再打开都能快速加载,速度比读文件快:
- 预处理完成后,运行这个命令保存需要的变量:
# 把所有预处理好的变量存起来 %store train_X train_y val_X val_y - 下次重启内核或者打开Notebook后,在训练的第一个单元格里先加载变量:
# 加载之前保存的变量 %store -r train_X train_y val_X val_y # 然后执行K.clear_session() from keras import backend as K K.clear_session()
小提醒
- 不管用哪种方法,
K.clear_session()都要放在加载完预处理数据之后执行,这样既不会影响数据,又能清理之前的Keras残留状态,避免训练时出现奇怪的问题。 - 如果你的预处理数据大到占内存,那可以考虑用numpy的
memmap做内存映射,但前面的三个方案已经能覆盖绝大多数场景啦。
内容的提问来源于stack exchange,提问作者JeToJedno
相关产品推荐
相关产品推荐

