2016-09-17 33 views
3

我Keras' image_dim_ordering属性设置为‘TF’,所以我定义我的模型,因为这:加载重物时keras设置为TF格式

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

但是当我打电话load_weights方法,

Exception: Layer weight shape (3, 3, 3, 64) not compatible with provided weight shape (64, 3, 3, 3) 

我如何可以加载这些权重,并自动转他们解决Tensorflow的格式:崩溃,因为我的模型是用“日”的格式保存的?

回答

7

我问弗朗索瓦CHOLLET这个(他没有一个SO账户)和他亲切沿着这个答复传递:


“TH”格式,则意味着卷积内核将具有形状(深度,input_depth,行,COLS)

“TF”格式,则意味着卷积内核将有

因此,你可以通过np.transpose(x, (2, 3, 1, 0))在从前者转化到后来的形状(行的cols,input_depth,深度) x是t的值他卷积核心。

下面是一些代码进行转换:

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层的下游,则第一致密层的权重矩阵将需要被重排为好。

+1

现在看来并非如此。 Theano和TensorFlow都具有相同的重量形状。当从“Th”转换为“TF”(反之亦然)时,我们必须翻转维度1和2(即“输入深度”和“深度”)。你知道这是为什么吗?如果你想看看从Th到TF(或反向)的kernel_conversion函数,看看[这里](https://github.com/fchollet/keras/blob/master/keras/utils/conv_utils.py#L67-L87) 。 –