将keras .h5模型更改为tensorflow .pb模型时出现错误

时间:2020-08-26 06:01:23

标签: python tensorflow keras

我想将keras .h5文件更改为tensorflow .pb文件。 .pb文件似乎出问题了。我的代码如下所示:

network_eval = model.vggvox_resnet2d_icassp(input_dim=params['dim'],
                                        num_class=params['n_classes'],
                                        mode='eval', args=args)  
path = 'XXX'
name = 'XXX.pb'
network_eval.load_weights(os.path.join(args.resume), by_name=True)   # load model 

# I use parts of the keras_to_tensorflow util, see https://github.com/amir-abdi/keras_to_tensorflow 
orig_output_node_names = [node.op.name for node in network_eval.outputs]
# I do not change the output_nodes_prefix, so 
converted_output_node_names = orig_output_node_names

sess = K.get_session()
constant_graph = graph_util.convert_variables_to_constants(sess, sess.graph.as_graph_def(), converted_output_node_names)
graph_io.write_graph(constant_graph, path, name, as_text=False)

.pb文件已成功生成,但是使用.pb模型的测试文件的预测输出与使用原始.h5 keras模型的输出不同。测试代码显示为

# using .h5 model 
for spec in specs:  # specs is sliced magtitude spectrum of a .wav file for predicting
    spec = np.expand_dims(np.expand_dims(spec, 0), -1)
    v_1 = network_eval.predict(spec)
    print(v_1)

# using .pb model
sess = tf.Session()
with gfile.FastGFile('XXX.pb', 'rb') as f:
     graph_def = tf.GraphDef()
     graph_def.ParseFromString(f.read())
     sess.graph.as_default()
     tf.import_graph_def(graph_def, name='')

sess.run(tf.global_variables_initializer())

# 'lambda_1/l2_normalize' is the name of the last layer of the network
# I got this name by printing network_eval.output.name
op = sess.graph.get_tensor_by_name('lambda_1/l2_normalize:0') 
x = sess.graph.get_tensor_by_name('input:0')

for spec in specs:
    spec = np.expand_dims(np.expand_dims(spec, 0), -1)
    v_2 = sess.run(op, feed_dict={x: spec, K.learning_phase(): 0})
    print(v_2)

如上所述,打印结果v_1和v_2完全不同,但是它们的形状相同,这使我感到困惑,而且我不知道哪一步出错。有没有人可以帮助我?我将非常感谢。

0 个答案:

没有答案