Инициализация модели TensorFlow CNN с матрицами весового коэффициента
Я работаю над ручным преобразованием предварительно обученной модели matconvnet в модель с тензорным потоком. Я вытащил весовые коэффициенты из файла mat matvvnet model, используя scipy.io, и получил пустые матрицы для весовых коэффициентов.
Фрагменты кода где 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']
например, это матрица 4x4x60, извлеченная из модели matconvnet для слоя. И вот как я определяю заполнитель для входов 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], и могу ли я сделать это таким образом?
Неудачная попытка:
- Вращение матриц-матриц: я знаю, что matlab и python имеют разную индексацию (индексация на основе 0 по сравнению с 1, а мажор строки по сравнению с мажором столбца). Несмотря на то, что я считаю, что все преобразовал надлежащим образом, я все еще экспериментировал с использованием таких библиотек, как np.rot90(), меняя массив 4x4x60 на 60x4x4.
- Использование tf.reshape: я пытался использовать tf.reshape для весов после обертывания их оболочкой tf.Variable, но я получаю, что у переменной нет атрибута "reshape"
ПРИМЕЧАНИЕ. Обратите внимание: я знаю, что существует ряд сценариев для перехода от matconvnet к caffe и caffe к tenorflow (как описано здесь, например, https://github.com/vlfeat/matconvnet/issues/1021)., Мой вопрос связан с вариантами инициализации весового потока:
1 ответ
Я преодолел это препятствие с tf.reshape(...)
(вместо звонка weights['wc1'].reshape(...)
). Я все еще не уверен насчет представления, или это ужасно наивное начинание.
ОБНОВЛЕНИЕ Дальнейшее тестирование, этот подход, по-видимому, возможен, по крайней мере, функционально (как, например, я создал модель TensorFlow CNN, которая будет работать и генерировать прогнозы, которые выглядят в соответствии с моделью MatConvNet. Я не претендую на точность между ними).
Я делюсь своим кодом В моем случае это была очень маленькая сеть - и если вы пытаетесь использовать этот код для своего проекта matconvnet to tenorflow, вам, вероятно, потребуется гораздо больше изменений: https://github.com/melissadale/MatConv2TensorFlow