使用 Numpy 权重矩阵初始化 TensorFlow CNN 模型

Initialize TensorFlow CNN model with Numpy weight matrices

我正在努力将预训练的 matconvnet 模型手动转换为 tensorflow 模型。我使用 scipy.io 从 matconvnet 模型 mat 文件中提取了 weights/biases 并获得了权重和偏差的 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 权重初始化选项有关:

我用 tf.reshape(...) 克服了这个障碍(而不是调用 weights['wc1'].reshape(...) )。我仍然不确定性能,或者这是否是一种非常幼稚的尝试。

UPDATE 进一步测试,这种方法似乎至少在功能上是可行的(因为我已经创建了一个 TensorFlow CNN 模型,它将 运行 并产生出现的预测与 MatConvNet 模型一致。我对两者之间的准确性不做任何声明)。

我正在分享我的代码。在我的例子中,这是一个非常小的网络 - 如果您尝试将此代码用于您自己的 matconvnet 到 tensorflow 项目,您可能需要更多修改:https://github.com/melissadale/MatConv2TensorFlow