1. tensorflow动态图和静态图切换
动态图是Tensorflow1.3版本之后出现的,到1.11版本时,已经比较完善。在2.0之后版本为默认工作方式。
tensorflow2.X 关闭动态图的函数
tf.compat.v1.disable_v2_behavior
启用动态图的函数:
tf.compat.v1.enable_v2_behavior
2.tensor和numpy互转
静态图中,tensor和numpy不能互转。动态图 可以转化
data_tensor= tf.convert_to_tensor(data_numpy) # numpy转tensor 显式转换。大多数情况tensor接收到numpy会自动转化
data_numpy = data_tensor.numpy() # tensor转numpy
3.声明函数为静态图
在函数前面加上 "@tf.function" 。函数将以张量运算图运行。自东土中,如果在被修饰的函数有多个返回分支,则必须确保所有的分支都返回相同类型的张量,否则会报错
4.在静态图中使用动态图
tensorflow2.X提供 在静态图使用动态图操作方式的封装关键字"tf.py_function"
tf.compat.v1.disable_v2_behavior # 使用静态图方式 def my_py_func(X,Y): …… return z z=tf.py_function(my_py_func,[X,Y] ,tf.float32) #后续接静态图调用过程代码 …… #程序执行时,my_py_func内 的tensor都是 “EaderTensro”动态tensor类型,因此可以numpy等数据类型相互转换调用
5.静态图和动态图性能差异
2021-9月份,数据集3万张,8个类。分别在批次=20,128下测试
测试以下三种方式:tf.kreas静态图方式, 2.X全部动态图方式,2.X部分动态图方式(train_step 使用 @tf.function 修饰,其余动态图) 。取三次情况做平均。测试结果如下
20批次(显卡6G显存): 以静态图为基准, 全动态图耗时是 140% , 部分动态图 100%
128批次(显卡24显存): 以静态图为基准,全部动态图耗时100% , 部分动态图 115%
似乎动态图性能都能找到方式和静态图一样的执行效率
6.冻结网络层
tensorflow只需要更改模型的"trainable" 属性即可完成更改。更改完,需要调用 模型的"compile"函数,完成关联项更改
trainable 的优先级,高级覆盖低级
model.trainable = False model.layers[0].trainable = False model.layers[1].trainable = True model.compile(……) 此时,整个模型都不可训练 model.trainable = True model.layers[0].trainable = False model.layers[1].trainable = True model.compile(……) 此时, 模型的layers层中设置使能性能的,进行巡礼。 比如训练过程 层0将不会进行参数更新。 层1将进行参数。 如果要详细查看 可以设定动态图,然后调试过程中 查看“self.model.trainable_weights”的值
7.迁移学习中,只训练输出层
参考“冻结网络层”, 将其余层的训练使能设为“False”,输出层的训练使能启用。