GPU上的Keras模型训练在第一个时期停止/挂起

n53p2ov0  于 2023-01-17  发布在  其他
关注(0)|答案(1)|浏览(147)

Mask RCNN模型中,我用一个自定义层替换了下面的Lambda层。当模型编译时,它不会在GPU上训练。它似乎在分配Workers之前停止在Epoch 1。我不确定我做错了什么。Lambda层不允许我保存模型,所以我必须使用另一种方法,但它不起作用。感谢任何帮助。

gt_boxes = KL.Lambda(lambda x: norm_boxes_graph(x, K.shape(input_image)[1:3]))(input_gt_boxes)

按自定义图层

gt_boxes = GtBoxesLayer(name='lambda_get_norm_boxes')([input_image, input_gt_boxes])

层代码为:

class GtBoxesLayer(tf.keras.layers.Layer):
    def __init__(self, **kwargs):
        super(GtBoxesLayer, self).__init__(**kwargs)

    def call(self, input):
        return norm_boxes_graph(input[1], get_shape_image(input[0]))

    def get_config(self):
        config = super(GtBoxesLayer, self).get_config()
        return config
    
    @classmethod
    def from_config(cls, config):
        return cls(**config)


def norm_boxes_graph(self, boxes, shape):
        """Converts boxes from pixel coordinates to normalized coordinates.
        boxes: [..., (y1, x1, y2, x2)] in pixel coordinates
        shape: [..., (height, width)] in pixels

        Note: In pixel coordinates (y2, x2) is outside the box. But in normalized
        coordinates it's inside the box.

        Returns:
            [..., (y1, x1, y2, x2)] in normalized coordinates
        """
        h, w = tf.split(tf.cast(shape, tf.float32), 2)
        scale = tf.concat([h, w, h, w], axis=-1) - tf.constant(1.0)
        shift = tf.constant([0., 0., 1., 1.])
        fin = tf.divide(boxes - shift, scale)
        return fin

def get_shape_image_(input_image_):
     shape_= tf.shape(input_image_)
     return shape_[1:3]
nbewdwxp

nbewdwxp1#

我编写的这个较小的example和一个自定义层的答案显示了如何为这个模型自定义层。而且这个模型需要我的案例工作器中所有可用的多处理单元= 40。save_weights_only=Truelayers='heads'已经设置。tf.config.experimental.set_memory_growth(gpus[gpu_index], True)这个模型中的每个原始自定义层都必须实现get_config()才能正确序列化。完整模型的训练和保存在之后工作。

相关问题