我想使用这个预训练模型。然而,它使用的是theano布局,而我的代码依赖于tensorflow图像尺寸顺序。
有一个在不同格式之间转换权重的指南。但是这似乎有问题。在将theano转换为tensorflow的部分中,第一条指令是将权重加载到tensorflow模型中。
这会引发异常,因为权重布局不兼容。 如果
我查看了
代码非常简单 - 我不明白为什么指南要使用tensorflow session。那似乎是不必要的。
我从预训练模型中复制了代码,创建了一个带有tensorflow层的模型。这只意味着在添加任何卷积之前更改输入形状和
在原始代码中,有一个测试用例:对一张猫的图像进行预测。我下载了一张猫的图片,并使用原始模型尝试了该测试用例:预测结果为285。转换后的模型预测结果为585。我不知道285是否是猫的正确标签,但即使不是,两个模型应该以相同的方式出现错误,我期望得到相同的预测结果。那么,在模型之间转换权重的正确方法是什么?
有一个在不同格式之间转换权重的指南。但是这似乎有问题。在将theano转换为tensorflow的部分中,第一条指令是将权重加载到tensorflow模型中。
在此情况下,Keras后端应该是TensorFlow。 首先,将Theano训练的权重加载到您的TensorFlow模型中:
model.load_weights('my_weights_theano.h5')
这会引发异常,因为权重布局不兼容。 如果
load_weights
函数接收theano权重用于tensorflow模型,则不需要进行任何转换。我查看了
convert_kernel
函数,以便确定是否可以自己执行必要的步骤。代码非常简单 - 我不明白为什么指南要使用tensorflow session。那似乎是不必要的。
我从预训练模型中复制了代码,创建了一个带有tensorflow层的模型。这只意味着在添加任何卷积之前更改输入形状和
backend.image_dim_ordering
。然后我使用了这个循环:
model
是最初从我在开头链接的代码中创建的原始模型。
model_tensorflow
是完全相同的模型,但具有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是否是猫的正确标签,但即使不是,两个模型应该以相同的方式出现错误,我期望得到相同的预测结果。那么,在模型之间转换权重的正确方法是什么?