我正在处理手动将验证的MatConvnet模型转换为张量集模型。我已经使用scipy.io从Matconvnet模型垫文件中拔出了权重/偏差,并获得了重量和偏见的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]
当前问题:我无法获得匹配的等级。我一贯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基于1的索引,而行主要与列专业(。即使我相信我已经适当地转换了所有内容,但我仍然使用NP.Rot90((将4x4x60阵列等库进行了实验。
- 使用tf.Reshape:我尝试在用tf.variable包装纸包装后尝试使用tf.Reshape,但是我得到的变量没有属性'reshape'
注意:请注意,我知道有许多脚本可以从plocconvnet到caffe,再到caffe到tensorflow(例如,如下所述,例如https://github.com/vlfeat/matconvnet/sissues/issues/1021(。我的问题与TensorFlow重量初始化选项有关:
- https://github.com/zoharby/matconvnet/blob/master/master/utils/convert_matconvnet_caffe.m
- https://github.com/ethereon/caffe-tensorflow
我用tf.reshape(...)
克服了这个障碍(而不是调用weights['wc1'].reshape(...)
(。我仍然不确定表演,或者这是一项可怕的幼稚努力。
更新进一步测试,这种方法似乎至少在功能上是可能的(就像我创建了一个TensorFlow CNN模型,该模型将运行并产生与MatConvnet模型一致的预测。我不提出要求关于两者之间的精度(。
我正在分享我的代码。就我而言,这是一个很小的网络 - 如果您试图将此代码用于tensorflow项目,则可能需要更多的修改:https://github.com/melissadale/matconv2tensorflow