Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将Tensorflow模型转换为Caffe模型_Tensorflow_Caffe - Fatal编程技术网

将Tensorflow模型转换为Caffe模型

将Tensorflow模型转换为Caffe模型,tensorflow,caffe,Tensorflow,Caffe,我希望能够将Tensorflow模型转换为Caffe模型 我在谷歌上搜索,但我只能找到从caffe到tensorflow的转换器,而不是相反的转换器 有人知道怎么做吗 谢谢, Evi正如@Patwie在评论中所建议的那样,您必须通过逐层复制权重来手动执行此操作。例如,要将第一个conv层权重从tensorflow检查点复制到caffemodel,必须执行以下操作: sess = tf.Session() new_saver = tf.train.import_meta_graph("/path/

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

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

有人知道怎么做吗

谢谢,
Evi

正如@Patwie在评论中所建议的那样,您必须通过逐层复制权重来手动执行此操作。例如,要将第一个conv层权重从tensorflow检查点复制到caffemodel,必须执行以下操作:

sess = tf.Session()
new_saver = tf.train.import_meta_graph("/path/to/checkpoint.meta")
what = new_saver.restore(sess, "/path/to/checkpoint")

all_vars = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES)

conv1 = all_vars[0]
bias1 = all_vars[1]

conv_w1, bias_1 = sess.run([conv1,bias1])

net = caffe.Net('path/to/conv.prototxt', caffe.TEST)

net.params['conv_1'][0].data[...] = conv_w1
net.params['conv_1'][1].data[...] = bias_1

...

net.save('modelfromtf.caffemodel')
注1:此代码未经测试。我不确定这是否可行,但我认为应该。此外,这仅适用于一个conv层。实际上,您必须首先分析tensorflow检查点,以检查哪些层的权重位于哪个索引(打印所有变量),然后分别复制每个层的权重

注2:一些自动化可以通过迭代初始conv层来完成,因为它们通常遵循一个设置模式(conv1->bn1->relu1->conv2->bn2->relu2…)


注3:Tensorflow可进一步将各层权重划分为单独的指数。例如:如上所示,conv层的权重和偏差是分开的。此外,对于批次归一化层,gamma、均值和方差是分开的。

我也遇到了同样的问题,并找到了解决方案。代码可以在这里找到(),我也在一些Youtube视频中记录了代码


包括在Caffe和中创建的体系结构(TensorFlow的更高级别API,对本机TensorFlow的代码进行一些更改也可以)


在将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])
对于卷积层,层名称为
Conv\u2d
。完全连接的层称为
FullyConnected
。如果您使用某一类型的多个图层,则会使用前面带有下划线的提升整数(例如,第二个conv图层称为
conv_2D_1
)。我在张力板的图表中找到了这些名字。如果在体系结构定义中命名层,则这些层名称可能会更改为您定义的名称

在本机TensorFlow中,导出将需要不同的代码,但参数的格式应相同,因此后续步骤仍应适用


涵盖实际转换。创建CAFEMODEL时,最关键的是权重的转换(偏差可以在不改变的情况下进行)。TensorFlow和Caffe在保存过滤器时使用不同的格式。TensorFlow使用
[高度、宽度、深度、过滤器数量]
(),而Caffe使用
[过滤器数量、深度、高度、宽度]
()。要在格式之间转换,您可以使用
转置
功能(例如:
weights\u of_first\u conv\u layer.transpose((3,2,0,1))
。通过枚举TensorFlow格式(原点),然后将其切换为Caffe格式(目标格式),可以获得3,2,0,1序列同时将数字保持在其特定变量。)。
如果您想将张量输出连接到完全连接的层,事情会变得有点棘手。如果使用输入大小为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和完全连接层之间的连接处导出参数,则从TensorFlow得到的是一个数组,其形状为
[张量中的条目,fc层中的单位]
(此处:
[8192,4096]
)。您必须找出输出张量的形状,然后重新调整数组的形状,使其符合TensorFlow格式(请参见上文,
number of filters
是fc层中的
单元数
)。之后,使用先前使用的转置转换,然后再次重塑数组,但反过来。TensorFlow将fc层权重保存为
[输入数量、输出数量]
,而Caffe则以另一种方式保存。
如果将两个fc层相互连接,则不必执行前面描述的复杂过程,但必须通过再次转置(
fc\u layer\u weights.transpose((1,0))
)来说明不同的fc层格式

然后,可以使用设置网络的参数

net.params['layer_name_in_prototxt'][0].data[...] = weights
net.params['layer_name_in_prototxt'][1].data[...] = biases
这是一个快速概述。如果您想要所有的代码,它在我的github存储库中。我希望这能有所帮助


干杯,

死亡

您可以使用Microsoft开发的实用程序。MMdnn是一个全面的跨框架工具,用于转换、可视化和诊断深度学习(DL)模型。

Caffe还提供了python包装器。唯一的方法是或多或少地手动复制权重。你提那个问题太早了。希望TensorFlow在不久的将来也能适应NX。这很难。Tensorflow是以代码为模型的,而caffe是以数据结构为模型的。