Keras: преобразование предварительно обученных весов между theano и tensorflow

Я хочу использовать эту предварительно обученную модель.

Это в макете anano, мой код зависит от порядка размеров изображения тензорного потока.

Есть руководство по преобразование веса между форматами.

Но это кажется сломанным. В разделе, посвященном преобразованию анано в тензорный поток, первая инструкция заключается в загрузке весов в модель тензорного потока.

В этом случае бэкэнд Keras должен быть TensorFlow. Сначала загрузите веса, обученные Theano, в вашу модель TensorFlow:

model.load_weights('my_weights_theano.h5')

Это вызывает исключение, схемы весов будут несовместимы. И если бы функция load_weights принимала веса ANO для модели тензорного потока, не было бы необходимости их преобразовывать.

Я взглянул на функцию convert_kernel, чтобы увидеть , мог ли я сам сделать необходимые шаги.

Код довольно прост - я не понимаю, почему руководство использует сеанс тензорного потока. Это кажется ненужным.

Я скопировал код из предварительно обученной модели, чтобы создать модель со слоем тензорного потока. Это просто означало изменение формы ввода и backend.image_dim_ordering перед добавлением каких-либо сверток. Затем я использовал этот цикл:

model - это исходная модель, созданная из кода, который я связал в начале. model_tensorflow - это точно такая же модель, но с макетом тензорного потока.

for i in range(len(model.layers)):
    layer_theano=model.layers[i]
    layer_tensorflow=model_tensorflow.layers[i]

    if layer_theano.__class__.__name__ in ['Convolution1D', 'Convolution2D', 'Convolution3D', 'AtrousConvolution2D']:
        weights_theano=layer_theano.get_weights()

        kernel=weights_theano[0]
        bias=weights_theano[1]

        converted_kernel=convert_kernel(kernel, "th")
        converted_kernel=converted_kernel.transpose((3,2,1,0))

        weights_tensorflow=[converted_kernel, bias]

        layer_tensorflow.set_weights(weights_tensorflow)

    else:
        layer_tensorflow.set_weights(layer_theano.get_weights())

В исходном коде есть тестовый пример: Прогнозирование выполнялось на изображении кошки. Я загрузил изображение кошки и попробовал тестовый пример с исходной моделью: 285. Конвертированная модель предсказывает 585.

Я не знаю, является ли 285 правильным ярлыком для кошки, но даже если это не так, две модели должны быть сломаны одинаково, я бы ожидал такого же прогноза.

Как правильно переводить веса между моделями?


person lhk    schedule 12.02.2017    source источник
comment
Любые обновления? Вы видели github.com/titu1994/Keras-Classification-Models?   -  person Martin Thoma    schedule 13.03.2017


Ответы (1)


Ты прав. Код не работает. На данный момент существует способ решения этой проблемы, и решение описано здесь.

Я сам это тестировал, и у меня это сработало.

Если вы считаете ответ полезным, проголосуйте за него. Спасибо!

person Tensorflow Support    schedule 19.08.2019