Ответ 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-слоя, как показано выше. Кроме того, гамма, среднее значение и дисперсия разделяются для слоя нормализации партии.