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