gpt4 book ai didi

tensorflow - 将 TensorFlow 模型转换为 Caffe 模型

转载 作者:行者123 更新时间:2023-12-03 08:09:46 25 4
gpt4 key购买 nike

我希望能够将 Tensorflow 模型转换为 Caffe 模型。

我在谷歌上搜索,但我只能找到从 caffe 到 tensorflow 的转换器,但不能找到相反的转换器。

有谁知道如何做到这一点?

谢谢,
埃维

最佳答案

我遇到了同样的问题并找到了解决方案。代码可以在这里找到 (https://github.com/lFatality/tensorflow2caffe),我还在一些 Youtube 视频中记录了代码。

Part 1涵盖了 VGG-19 架构的创建在 Caffe 和 tflearn (TensorFlow 的更高级别 API,对原生 TensorFlow 代码进行一些更改也应该可以工作)。

Part 2描述了将 TensorFlow 模型中的权重和偏差导出到 numpy 文件中。在 tflearn 中,您可以像这样获得层的权重:

#get parameters of a certain layer
conv2d_vars = tflearn.variables.get_layer_variables_by_name(layer_name)
#get weights out of the parameters
weights = model.get_weights(conv2d_vars[0])
#get biases out of the parameters
biases = model.get_weights(conv2d_vars[1])

对于卷积层,layer_name 为 Conv_2D .全连接层称为 FullyConnected .如果您使用多个特定类型的层,则使用带有前下划线的提升整数(例如,第二个转换层称为 Conv_2D_1)。我在 TensorBoard 的图表中找到了这些名称。如果您在架构定义中命名层,那么这些 layer_names 可能会更改为您定义的名称。

在原生 TensorFlow 中,导出需要不同的代码,但参数的格式应该相同,因此后续步骤仍然适用。

Part 3涵盖实际转换。关键是创建 caffemodel 时的权重转换(偏差可以在不改变的情况下延续)。 TensorFlow 和 Caffe 在保存过滤器时使用不同的格式。而 TensorFlow 使用 [height, width, depth, number of filters] ( TensorFlow docs, at the bottom ),Caffe 使用 [number of filters, depth, height, width] ( Caffe docs, chapter 'Blob storage and communication')。要在格式之间进行转换,您可以使用 transpose函数(例如: weights_of_first_conv_layer.transpose((3,2,0,1)) 。3,2,0,1 序列可以通过枚举TensorFlow格式(起源)然后将其切换为Caffe格式(目标格式),同时将数字保持在其特定变量。 )。
如果你想将张量输出连接到全连接层,事情会变得有点棘手。如果您使用输入大小为 112x112 的 VGG-19,它看起来像这样。
fc1_weights = data_file[16][0].reshape((4,4,512,4096))
fc1_weights = fc1_w.transpose((3,2,0,1))
fc1_weights = fc1_w.reshape((4096,8192))

如果你在张量和全连接层之间的连接处导出参数,你从 TensorFlow 得到的是一个形状为 [entries in the tensor, units in the fc-layer] 的数组。 (此处: [8192, 4096])。您必须找出输出张量的形状,然后对数组进行整形,使其适合 TensorFlow 格式(见上文, number of filtersnumber of units in the fc-layer)。之后,您使用之前使用过的转置转换,然后再次 reshape 数组,但反过来。而 TensorFlow 将 fc 层权重保存为 [number of inputs, number of outputs] , Caffe 反其道而行之。
如果将两个 fc 层相互连接,则不必执行前面描述的复杂过程,但必须通过再次转置来考虑不同的 fc 层格式 ( fc_layer_weights.transpose((1,0)))

然后,您可以使用设置网络参数
net.params['layer_name_in_prototxt'][0].data[...] = weights
net.params['layer_name_in_prototxt'][1].data[...] = biases

这是一个快速概述。如果你想要所有的代码,它在我的 github 存储库中。我希望它有所帮助。 :)

干杯,
死亡率

关于tensorflow - 将 TensorFlow 模型转换为 Caffe 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41138481/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com