当项目运用到加载多个tf模型的时候,要慎用tf.get_default_graph(),因为可能会报错,比如:
NotFoundError (see above for traceback): Key bidirectional/backward_cu_dnnlstm/bias not found in checkpoint
[[Node: save/RestoreV2 = RestoreV2[dtypes=[DT_FLOAT, DT_FLOAT, DT_FLOAT, DT_FLOAT, DT_FLOAT, ..., DT_FLOAT, DT_FLOAT, DT_FLOAT, DT_FLOAT, DT_FLOAT],
_device="/job:localhost/replica:0/task:0/device:CPU:0"](_arg_save/Const_0_0, save/RestoreV2/tensor_names, save/RestoreV2/shape_and_slices)]]
[[Node: save/RestoreV2/_157 = _Recv[client_terminated=false, recv_device="/job:localhost/replica:0/task:0/device:GPU:0",
send_device="/job:localhost/replica:0/task:0/device:CPU:0", send_device_incarnation=1,
tensor_name="edge_171_save/RestoreV2", tensor_type=DT_FLOAT,
_device="/job:localhost/replica:0/task:0/device:GPU:0"]()]]
这是因为第一个tf模型加载的时候,使用了tf.get_default_graph(),创建了全局性的默认graph。那么第二个tf模型加载的时候,就会使用同一个全局性的默认graph,也就是说,第二个tf模型用了第一个模型的graph,很显然,这样会报错。
正确的做法,应该是每个模型都用自己的graph去加载模型参数,而不应该用同一个全局性的默认graph。具体可以这样做:每个模型加载的时候,都使用tf.Graph()创建自己局部的graph,然后在自己的局部graph下去初始化模型和加载模型参数。