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