无法将咖啡重量转换为喀拉斯重量

时间:2019-08-08 12:27:19

标签: keras deep-learning conv-neural-network caffe transfer-learning

我正在尝试将caffe googlenet模型转换为keras模型。到目前为止,我设法转换了结构,即从deploy.prototxt文件生成了一个keras模型(至少对于层类型为Convolutional,Pooling,Activation,Concatenate,Dense和Dropout的单个输入/输出caffe模型)。

这里是architecture

虽然我很难转换权重。这是我编写的

for layer in layers:
    tensor=layer(tensor)
    if layer.name in googlenet.params:
        weights,bias=googlenet.params[layer.name][0].data,googlenet.params[layer.name][1].data
        if len(weights.shape)==4:
            tf_weights=weights.reshape((weights.shape[2],weights.shape[3],weights.shape[1],weights.shape[0]))
        elif len(weights.shape)==2:
            tf_weights=weights.reshape((weights.shape[1],weights.shape[0]))

        layer.set_weights([tf_weights,bias])

没有执行问题,因此形状很好,最后我有一个结构相同的网络,但我意识到输出不匹配。

为解决此问题,我尝试查看在第一卷积层之后发生的情况。

因此,我有一个输入形状为(128,128,3)的卷积模型,其中有一个卷积层,然后是带有Googlenet权重的ReLU。

model.summary()
for layer in model.layers:
    if layer.name in net.params:
        tf_weights=layer.get_weights()[0]
        caffe_weights=net.params[layer.name][0].data
        tf_bias=layer.get_weights()[1]
        caffe_bias=net.params[layer.name][1].data

        tf_weights=tf_weights.reshape((tf_weights.shape[3],tf_weights.shape[2],tf_weights.shape[1],tf_weights.shape[0]))
        print np.all(tf_weights==caffe_weights)
        print np.all(tf_bias==caffe_bias)

这是output

但是,当我比较给定图像上两个网络的输出时,它们不匹配:

#preprocessing image and computing outputs
im_prep=im.astype('float64')
im_prep_tf=im_prep[np.newaxis,:,:,:]
im_prep_caffe= np.rollaxis(im_prep_tf,3,1)
net.blobs['data'].data[...]=im_prep_caffe
net.forward()
tensor_caf=net.blobs['conv1/7x7_s2'].data
tensor_tf=model.predict(im_prep_tf)
#comparing tensors
i=np.random.randint(0,tensor_caf.shape[1])
print tensor_caf[0,i,:,:]-tensor_tf[0,:,:,i]

非零。

0 个答案:

没有答案