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”,输出层的训练使能启用。

 

  模型能够加载, 但是执行如下语句

y = model(x, training=True)

 程序不报异常,直接结束执行。 

  原因: cuda,cudnn 和tensorflow版本不匹配。tensorflow官网 安装页面 “GPU支持”有cuda11.2字样, 最下面又有cuda11.1 。 并且安装的适合没有像 pytorch ,直接在安装语句指定 cuda版本。 误以为安装最新版本都支持。因此安装cuda11.4+cudnn8.2 。 

  解决办法:按照tensorflow官网-》源代码构建 -》Windows  tensorflow_知识点 

 

  版本对应关系,安装后解决。

       PS: 安装最新版本驱动,再安装cuda11.2 会报 已经安装更新版本,无法安装cuda11.2。此时需要手动卸掉tensorflow_知识点 。 安装cuda后,再安装一次显卡驱动。