keras冻结_如何将具有自定义keras层(.h5)的keras模型冻结到tensorflow图(.pb)?...

我正在尝试实现一个用于对象检测的更快的RCNN模型dataset_Keras" rel="nofollow noreferrer">written by Yinghan Xu。在我用model_all.save('filename.h5')训练并保存模型之后,我试图将Keras模型冻结为TensorFlow图(as .pb),以便使用Amir Abdi编写的keras_to_tensorflow.py进行推理。但是当我试图转换它时,我得到了一个ValueError: Unknown layer: roipoolingconv,这是因为有一个自定义的RoiPoolingConv层:class RoiPoolingConv(Layer):

'''ROI pooling layer for 2D inputs.

See Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition,

K. He, X. Zhang, S. Ren, J. Sun

# Arguments

pool_size: int

Size of pooling region to use. pool_size = 7 will result in a 7x7 region.

num_rois: number of regions of interest to be used

# Input shape

list of two 4D tensors [X_img,X_roi] with shape:

X_img:

`(1, rows, cols, channels)`

X_roi:

`(1,num_rois,4)` list of rois, with ordering (x,y,w,h)

# Output shape

3D tensor with shape:

`(1, num_rois, channels, pool_size, pool_size)`

'''

def __init__(self, pool_size, num_rois, **kwargs):

self.dim_ordering = K.image_dim_ordering()

self.pool_size = pool_size

self.num_rois = num_rois

super(RoiPoolingConv, self).__init__(**kwargs)

def build(self, input_shape):

self.nb_channels = input_shape[0][3]

def compute_output_shape(self, input_shape):

return None, self.num_rois, self.pool_size, self.pool_size, self.nb_channels

def call(self, x, mask=None):

assert(len(x) == 2)

# x[0] is image with shape (rows, cols, channels)

img = x[0]

# x[1] is roi with shape (num_rois,4) with ordering (x,y,w,h)

rois = x[1]

input_shape = K.shape(img)

outputs = []

for roi_idx in range(self.num_rois):

x = rois[0, roi_idx, 0]

y = rois[0, roi_idx, 1]

w = rois[0, roi_idx, 2]

h = rois[0, roi_idx, 3]

x = K.cast(x, 'int32')

y = K.cast(y, 'int32')

w = K.cast(w, 'int32')

h = K.cast(h, 'int32')

# Resized roi of the image to pooling size (7x7)

rs = tf.image.resize_images(img[:, y:y+h, x:x+w, :], (self.pool_size, self.pool_size))

outputs.append(rs)

final_output = K.concatenate(outputs, axis=0)

# Reshape to (1, num_rois, pool_size, pool_size, nb_channels)

# Might be (1, 4, 7, 7, 3)

final_output = K.reshape(final_output, (1, self.num_rois, self.pool_size, self.pool_size, self.nb_channels))

# permute_dimensions is similar to transpose

final_output = K.permute_dimensions(final_output, (0, 1, 2, 3, 4))

return final_output

def get_config(self):

config = {'pool_size': self.pool_size,

'num_rois': self.num_rois}

base_config = super(RoiPoolingConv, self).get_config()

return dict(list(base_config.items()) + list(config.items()))

我已经看过了大部分的资源,几乎所有的资源都建议对这一层进行注释。但由于这一层对于对象检测很重要,我想知道是否有解决办法。在

错误的完整回溯(注意:我将文件名保存为freezekeras.py,内容与keras_to_tensorflow.py相同):

^{pr2}$

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值