gpt4 book ai didi

tensorflow - keras 设置为 TF 格式时以 TH 格式加载权重

转载 作者:行者123 更新时间:2023-12-03 20:24:52 24 4
gpt4 key购买 nike

我有 Keras 的 image_dim_ordering属性设置为'tf',所以我将我的模型定义为:

model = Sequential()
model.add(ZeroPadding2D((1, 1), input_shape=(224, 224, 3)))
model.add(Convolution2D(64, 3, 3, activation='relu'))

但是当我调用 load_weights方法,它崩溃了,因为我的模型是使用“th”格式保存的:
Exception: Layer weight shape (3, 3, 3, 64) not compatible with provided weight shape (64, 3, 3, 3)

如何加载这些权重并自动转置它们以修复 Tensorflow 的格式?

最佳答案

我向 Francois Chollet 询问了这个问题(他没有 SO 帐户),他友好地传递了这个回复:

"th"格式意味着卷积核的形状为 (depth, input_depth, rows, cols)

“tf”格式意味着卷积核将具有形状(行、列、输入深度、深度)

因此,您可以通过 np.transpose(x, (2, 3, 1, 0)) 将前者转换为后者。其中 x 是卷积核的值。

这是一些进行转换的代码:

from keras import backend as K

K.set_image_dim_ordering('th')

# build model in TH mode, as th_model
th_model = ...
# load weights that were saved in TH mode into th_model
th_model.load_weights(...)

K.set_image_dim_ordering('tf')

# build model in TF mode, as tf_model
tf_model = ...

# transfer weights from th_model to tf_model
for th_layer, tf_layer in zip(th_model.layers, tf_model.layers):
if th_layer.__class__.__name__ == 'Convolution2D':
kernel, bias = layer.get_weights()
kernel = np.transpose(kernel, (2, 3, 1, 0))
tf_layer.set_weights([kernel, bias])
else:
tf_layer.set_weights(tf_layer.get_weights())

如果模型包含 Convolution2D 层下游的 Dense 层,则第一个 Dense 层的权重矩阵也需要重新洗牌。

关于tensorflow - keras 设置为 TF 格式时以 TH 格式加载权重,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39547279/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com