2

我正在手动将预训练的 matconvnet 模型转换为 tensorflow 模型。我已经使用 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 模型中提取的用于 for 层的 4x4x60 numpy 矩阵在哪里。这就是我为 9x9 输入定义占位符的方式。

X = tf.placeholder(tf.float32, [None, 9, 9]) #also tried with [None, 81] with a tf.reshape, [None, 9, 9, 1]

当前问题:我无法获得匹配的等级。我一直getValueError:

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 has no attribute 'reshape'

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

4

1 回答 1

1

我克服了这个障碍tf.reshape(...)(而不是打电话weights['wc1'].reshape(...))。我仍然不确定性能,或者这是否是一个可怕的天真的努力。

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

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

于 2018-02-13T18:28:54.607 回答