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

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

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

Существует руководство по преобразованию весов между форматами.

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

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

model.load_weights('my_weights_theano.h5')

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

Я посмотрел на функцию 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 правильной меткой для кошки, но даже если это не так, две модели должны быть разбиты одинаково, я ожидаю одного и того же прогноза.

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

Ответ 1

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

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

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