将Tensorflow模型转换为Caffe模型
我希望能够将Tensorflow模型转换为Caffe模型 我在谷歌上搜索,但我只能找到从caffe到tensorflow的转换器,而不是相反的转换器 有人知道怎么做吗 谢谢,将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/
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是以数据结构为模型的。