我正在努力将预训练的matconvnet模型手动转换为张量流模型。我使用scipy.io从matconvnet模型mat文件中提取权重/偏差,并获得权重和偏差的numpy矩阵。
代码段,其中data
是从scipy.io返回的字典:
for i in data['net2']['layers']:
if i.type == 'conv':
model.append({'weights': i.weights[0], 'bias': i.weights[1], 'stride': i.stride, 'padding': i.pad, 'momentum': i.momentum,'lr': i.learningRate,'weight_decay': i.weightDecay})
...
weights = {
'wc1': tf.Variable(model[0]['weights']),
'wc2': tf.Variable(model[2]['weights']),
'wc3': tf.Variable(model[4]['weights']),
'wc4': tf.Variable(model[6]['weights'])
}
...
其中model[0]['weights']
是从matconvnet模型中为层获取的4x4x60 numpy矩阵,例如。这就是我为9x9输入定义占位符的方法。
X = tf.placeholder(tf.float32, [None, 9, 9]) #also tried with [None, 81] with a tf.reshape, [None, 9, 9, 1]
当前问题:我无法让排名匹配。我一直得到ValueError:
ValueError: Shape must be rank 4 but is rank 3 for 'Conv2D' (op: 'Conv2D') with input shapes: [?,9,9], [4,4,60]
摘要
未成功尝试:
注意: 请注意,我知道有许多脚本可以从matconvnet到caffe,以及caffe到tensorflow(如此处所述,例如,https://github.com/vlfeat/matconvnet/issues/1021)。我的问题与tensorflow权重初始化选项有关:
答案 0 :(得分:1)
我用tf.reshape(...)
克服了这个障碍(而不是调用weights['wc1'].reshape(...)
)。我仍然不确定表现,或者这是一个非常天真的努力。
更新进一步测试,这种方法至少在功能上似乎是可能的(因为我创建了一个TensorFlow CNN模型,它将运行并产生与MatConvNet模型一致的预测。我没有声明关于两者之间的准确性)。
我正在分享我的代码。就我而言,它是一个非常小的网络 - 如果您尝试将此代码用于自己的matconvnet到tensorflow项目,您可能需要进行更多修改:https://github.com/melissadale/MatConv2TensorFlow