Инициализация модели 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

Другие вопросы по тегам