0.配置

  1. #如果你使用tensorflow+keras總是異常掛掉,請務必加入以下語法
  2. #(貪心的tf把所有gpu全吃光一點不留給keras,變成全掛的慘劇)
  3. config = tf.ConfigProto()
  4. config.gpu_options.per_process_gpu_memory_fraction = 1
  5. config.gpu_options.visible_device_list = "0"
  6. config.gpu_options.allow_growth = True
  7. #显存的分配
  8. config.gpu_options.allocator_type = 'BFC'
  9. config.gpu_options.per_process_gpu_memory_fraction = 0.90
  10. 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. # 1.keras方式保存
  2. # 1.1 保存模型结构及权重
  3. model.save('./tf_model/keras_model_titanic.h5')
  4. del model #删除现有模型
  5. # identical to the previous one
  6. model = models.load_model('./tf_model/keras_model_titanic.h5')
  7. print(model.predict_classes(x_test[0:10]))
  8. #1.2 保存模型结构
  9. json_str = model.to_json()
  10. #1.2 保存模型权重
  11. model.save_weights('./tf_model/keras_model_weight_titanic.h5')
  12. # 恢复模型结构
  13. model_json = models.model_from_json(json_str)
  14. model_json.compile(
  15. optimizer='adam',
  16. loss='binary_crossentropy',
  17. metrics=['AUC']
  18. )
  19. # 加载权重
  20. model_json.load_weights('./tf_model/keras_model_weight_titanic.h5')
  21. print(model_json.predict_classes(x_test[0:10]))
  22. #=================================================
  23. #2.tensorflow原生方式保存
  24. # 保存权重,该方式仅仅保存权重张量
  25. model.save_weights('./tf_model/tf_model_weights_titanic.ckpt',save_format = "tf")
  26. # 保存模型结构与模型参数到文件(pb文件),该方式保存的模型具有跨平台性便于部署
  27. # 需要先新建文件夹/tf_model/tf_model_titanic
  28. model.save('./tf_model/tf_model_titanic', save_format="tf")
  29. print('export saved model.')
  30. model_loaded = tf.keras.models.load_model('./tf_model/tf_model_titanic')
  31. 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