我在3个文件中保存了一个经过训练的模型,并使用了一些tensorflow(1.x(代码行。我需要将模型转换为.h5(keras(,以便将其导入到Matlab中。
模型保存在3个文件中:
- xxx.ckpt.data00000-of-00001
- xxx.ckpt.index
- xxx.ckpt.meta
tensorflow代码行如下:
zzz = "a function of the previous line"
session_name = "a function of xxx"
sess = tf.Session()
saver = tf.train.Saver()
saver.restore(sess,session_name)
output=sess.run(zzz, ...)
是否可以将经过培训的网络导出为H5文件?如果是,怎么做?
附加:我已经向一位朋友提出了要求,但显然这是不可能的,因为首先,我必须"翻译"喀拉拉邦的网络结构。这一步对我在该领域的水平来说太难了。
据我所知,目前还没有使用检查点文件并直接转换到h5(keras(的方法。相反,您可以通过下面提到的一些变通方法来实现这一点。
- 如果你想要网络架构,那么你需要在Keras中重写代码
- 如果只想转换权重(假设您有相同模型的代码(,则必须创建一个具有随机权重的模型,然后读取具有
tf.train.NewCheckpointReader
的TensorFlow .ckpt
文件,然后为每个相应层调用set_weights()
方法
下面提到的相同的示例代码:
reader = tf.train.NewCheckpointReader(filename)
for key in reader.get_variable_to_shape_map():
# not saving the following tensors
if key == 'global_step':
continue
if 'AuxLogit' in key:
continue
# convert tensor name into the corresponding Keras layer weight name and save
path = os.path.join(output_folder, get_filename(key))
arr = reader.get_tensor(key)
np.save(path, arr)
可以使用保存的.npy文件输出h5(keras(中的模型权重,如下所示。
for layer in tqdm(model.layers):
if layer.weights:
weights = []
for w in layer.weights:
weight_name = os.path.basename(w.name).replace(':0', '')
weight_file = layer.name + '_' + weight_name + '.npy'
weight_arr = np.load(numpy_weight_file)
# remove the "background class"
if weight_file.startswith('Logits_bias'):
weight_arr = weight_arr[1:]
elif weight_file.startswith('Logits_kernel'):
weight_arr = weight_arr[:, 1:]
weights.append(weight_arr)
layer.set_weights(weights)
model.save_weights("Keras_model.h5")