lhk*_*lhk 11 python numpy theano keras tensorflow
我想使用这个预训练的模型:https://gist.github.com/baraldilorenzo/07d7802847aaad0a35d3
它是在theano布局中,我的代码依赖于tensorflow图像维度排序.
有关于在格式之间转换权重的指南:https://github.com/fchollet/keras/wiki/Converting-convolution-kernels-from-Theano-to-TensorFlow-and-vice-versa
但这似乎破了.在将theano转换为tensorflow的部分中,第一条指令是将权重加载到张量流模型中.
在这种情况下,Keras后端应该是TensorFlow.首先,将Theano训练的权重加载到TensorFlow模型中:
model.load_weights('my_weights_theano.h5')
Run Code Online (Sandbox Code Playgroud)
这引发了一个例外,重量布局将是不兼容的.如果load_weights函数将对张量流模型采用theano权重,则不需要转换它们.
我看了看这个convert_kernel功能.要看,我自己可以做一些必要的步骤:https://github.com/fchollet/keras/blob/master/keras/utils/np_utils.py
代码很简单 - 我不明白为什么指南会让使用张量流会话.这似乎没必要.
我已经从预训练模型中复制了代码,以创建具有张量流层的模型.这只是意味着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())
Run Code Online (Sandbox Code Playgroud)
在原始代码中,有一个测试用例:预测在猫的图像上运行.我已经下载了猫图像并尝试使用原始模型的测试用例:285.转换后的模型预测585.
我不知道285是否是猫的正确标签,但即使不是,两个模型应该以相同的方式打破,我期望相同的预测.
在模型之间转换权重的正确方法是什么?
| 归档时间: |
|
| 查看次数: |
2346 次 |
| 最近记录: |