Преобразование модели Tensorflow в модель Caffe

Я хотел бы иметь возможность конвертировать модель Tensorflow в модель Caffe.

Я искал в google, но мне удалось найти только конвертеры из caffe to tensorflow, но не наоборот.

Есть ли у кого-нибудь идея о том, как это сделать?

Спасибо, Evi

Ответы

Ответ 1

Как было предложено в комментарии от @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-слоя. На практике вам необходимо сначала проанализировать контрольную точку тензорного потока, чтобы проверить, какие весы слоев имеют индекс (print all_vars), а затем копировать каждый вес каждого уровня.

Примечание2: Некоторая автоматизация может быть выполнена путем итерации по начальным уровням conv, поскольку они обычно следуют шаблону набора (conv1- > bn1- > relu1- > conv2- > bn2- > relu2...)

Примечание3: Тензорный поток может дополнительно разделить вес каждого слоя на отдельные индексы. Например: весы и смещения разделяются для conv-слоя, как показано выше. Кроме того, гамма, среднее значение и дисперсия разделяются для слоя нормализации партии.