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

时间:2018-02-12 23:22:25

标签: python tensorflow machine-learning matconvnet

我正在努力将预训练的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]  

摘要

  • 是否可以从numpy数组中明确定义张量流模型的权重?
  • 为什么我的体重矩阵的等级为4?我的numpy数组应该更像[?,4,4,60],我可以这样做吗?

未成功尝试:

  • 旋转numpy矩阵:我知道matlab和python有不同的索引,(0基于索引与基于1,行主要与列主要)。即使我相信我已经适当地转换了一切,我仍然尝试使用像np.rot90()这样的库将4x4x60阵列更改为60x4x4。
  • 使用tf.reshape:我尝试在使用tf.Variable包装器包装它们之后对权重使用tf.reshape,但我得到Variable没有属性' reshape'

注意: 请注意,我知道有许多脚本可以从matconvnet到caffe,以及caffe到tensorflow(如此处所述,例如,https://github.com/vlfeat/matconvnet/issues/1021)。我的问题与tensorflow权重初始化选项有关:

1 个答案:

答案 0 :(得分:1)

我用tf.reshape(...)克服了这个障碍(而不是调用weights['wc1'].reshape(...))。我仍然不确定表现,或者这是一个非常天真的努力。

更新进一步测试,这种方法至少在功能上似乎是可能的(因为我创建了一个TensorFlow CNN模型,它将运行并产生与MatConvNet模型一致的预测。我没有声明关于两者之间的准确性)。

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