0.配置
#如果你使用tensorflow+keras總是異常掛掉,請務必加入以下語法
#(貪心的tf把所有gpu全吃光一點不留給keras,變成全掛的慘劇)
config = tf.ConfigProto()
config.gpu_options.per_process_gpu_memory_fraction = 1
config.gpu_options.visible_device_list = "0"
config.gpu_options.allow_growth = True
#显存的分配
config.gpu_options.allocator_type = 'BFC'
config.gpu_options.per_process_gpu_memory_fraction = 0.90
set_session(tf.Session(config=config))
0.1BFC Allocator
使用GPU训练时,一次训练任务无论是模型参数还是中间结果都需要占用大量显存。为了避免每次训练重新开辟显存带来计算之外的开销,一般框架的做法是在真正的训练任务开始前,将每个节点的输入和输出,以及模型参数的shape计算出来并全局开辟一次,例如Caffe就是这种做法。
随着深度学习模型的发展和迭代,不仅模型训练的数据shape可能发生变化,就连模型本身在训练过程中也可能发生变化,那么按照固定shape一次开辟显存的做法就不能满足需求了。为此,TensorFlow重新设计了较为灵活的显存管理机制,它使用了名为BFC的分配算法,并通过BFC Allocator为每个Tensor分配满足需求的显存。
【问题】Tensor在每次创建时会得到存储区域,而每一轮训练都要重新创建新的Tensor,那么这里面临的一个问题:如此频繁的分配和回收存储区,如何才能做的高效?
【解决思路】将显存按照不同的大小一次性开辟出来,并组成存储池,每次调用Allocate函数时从存储池中获取,Tensor回收时将显存重新挂到存储池中。BFC Allocator原理核心在于将存储区划分成块,并挂入存储池中进行管理;TensorFlow将存储块以及相应的块信息抽象为一种叫做Chunk的数据结构。
BFC Allocator是为了应对TensorFlow中频繁分配释放存储空间需求的场景而出现的解决方案,通过事先将存储空间从物理设备上开辟好,并将这些空闲存储空间封装成Chunk,组织成有序双向链表,然后利用Bin这一种索引结构为Chunk的查询做加速,最终完成了高效的分配算法。在实际分配时,可能会遇到Chunk链表中不存在符合要求的空闲Chunk情况,这时候就可能需要向物理设备中再次开辟新的存储空间,这个过程被视为对Chunk链表的扩展,对应的过程是Extend。因为是按Chunk进行分配,势必可能造成存储碎片,为了解决碎片问题,BFC Allocator设计了SplitChunk和Merge函数。
1.结构化数据建模流程
结构化数据一般会使用Pandas中的DataFrame进行预处理。
利用Pandas的数据可视化功能我们可以简单地进行探索性数据分析EDA(Exploratory Data Analysis)。
# 1.keras方式保存
# 1.1 保存模型结构及权重
model.save('./tf_model/keras_model_titanic.h5')
del model #删除现有模型
# identical to the previous one
model = models.load_model('./tf_model/keras_model_titanic.h5')
print(model.predict_classes(x_test[0:10]))
#1.2 保存模型结构
json_str = model.to_json()
#1.2 保存模型权重
model.save_weights('./tf_model/keras_model_weight_titanic.h5')
# 恢复模型结构
model_json = models.model_from_json(json_str)
model_json.compile(
optimizer='adam',
loss='binary_crossentropy',
metrics=['AUC']
)
# 加载权重
model_json.load_weights('./tf_model/keras_model_weight_titanic.h5')
print(model_json.predict_classes(x_test[0:10]))
#=================================================
#2.tensorflow原生方式保存
# 保存权重,该方式仅仅保存权重张量
model.save_weights('./tf_model/tf_model_weights_titanic.ckpt',save_format = "tf")
# 保存模型结构与模型参数到文件(pb文件),该方式保存的模型具有跨平台性便于部署
# 需要先新建文件夹/tf_model/tf_model_titanic
model.save('./tf_model/tf_model_titanic', save_format="tf")
print('export saved model.')
model_loaded = tf.keras.models.load_model('./tf_model/tf_model_titanic')
print(model_loaded.predict_classes(x_test[0:10]))
2.图片数据建模流程
在tensorflow中准备图片数据的常用方案有两种:
第一种是使用tf.keras中的ImageDataGenerator工具构建图片数据生成器。
第二种是使用tf.data.Dataset搭配tf.image中的一些图片处理方法构建数据管道。
3.文本数据建模流程
4.时间序列数据建模流程
参考: 1.BFC Allocator:https://www.cnblogs.com/deep-learning-stacks/p/10741859.html