繁体   English   中英

Keras:在theano和tensorflow之间转换预训练的权重

[英]Keras: convert pretrained weights between theano and tensorflow

我想使用这个预训练模型

它是在theano布局中,我的代码依赖于tensorflow图像维度排序。

有关于在格式之间转换权重的指南。

但这似乎破了。 在将theano转换为tensorflow的部分中,第一条指令是将权重加载到张量流模型中。

在这种情况下,Keras后端应该是TensorFlow。 首先,将Theano训练的权重加载到TensorFlow模型中:

model.load_weights('my_weights_theano.h5')

这引发了一个例外,重量布局将是不兼容的。 如果load_weights函数将采用张量流模型的theano权重,则不需要转换它们。

我看了一下convert_kernel函数,看看我是否可以自己做必要的步骤。

代码相当简单 - 我不明白为什么指南使用tensorflow会话。 这似乎没必要。

我已经从预训练模型中复制了代码,以创建具有张量流层的模型。 这只是意味着在添加任何Convolutions之前更改输入形状和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是否是猫的正确标签,但即使不是,两个模型应该以相同的方式打破,我期望相同的预测。

在模型之间转换权重的正确方法是什么?

你是对的。 代码坏了。 截至目前,有一个解决此问题的方法, 此处描述了解决方案。

我自己测试了它,它对我有用。

如果您觉得答案很有用,请提供帮助。 谢谢!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM