我正在手动将预训练的 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) . 我的问题与张量流权重初始化选项有关: