美文网首页深度学习
设计模式在机器学习中应用(1)

设计模式在机器学习中应用(1)

作者: zidea | 来源:发表于2020-07-23 19:35 被阅读0次

设计模式是对语言能力的一种补充,这是自己通过学习对设计模式从概念上的理解。最近写了许多预测和推荐想必大家看到这么多公式和数学推导也已经烦了。不过这是我的工作,希望把业余时间也尽量花费到工作上。

个人是 developer 出身,经历一段时间的编程工作,也养成了用 coding 思维方式,学会点如何将我们生活工作场景转换到计算机的世界里去一些方法方式。这点可能让我相对于那些基础知识雄厚刚才校门走出高才生会有一点优势吧,可能吧,我也不清楚。

python 语言早在接触他之前,就已经对他有所耳闻,想什么“人生苦短,我用 python” 的名言格局也听了很多。也尝试学过一些,不过因为没有什么实际应用场景,也就是当作 toy 玩了后放下了。直到两年前吧,确切的时间记不住,开始学习机器时,又再次将其捡起,直到今年在工作中大量用到 python 去写一些基于机器学习实现的应用。

既然用了就想把用好,虽然有点其他语言功底,但是毕竟语言之间还是不小差别,特别是像 python 这样独树一帜特点鲜明语言,要学好 python 还是需要下一番功夫的。

语言也是分为很多派系,例如面向对象的、面向过程的和函数式的语言、如果按其活跃领域有可分为,web 开发语言、嵌入式开发语言或者是数据库开发语言等。那么 python 的定位是什么呢?

在机器学习中,我们编写代码来实现一定功能,需要用到 python 的一些特性,其中也会涉及语言设计模式,所以今天结合机器学习应用架构来说一说。

生成器模式

现在互联网起家的企业转投做手机的不少,多半也取得了成功。其实互联网公司只负责手机外形设计、系统开发和部件采购。具体组装的工作都交给了代工工厂去完成部件组装和生成。这是因为设计和组装手机不是一回事,可以分头去做。


image

那么生成器与我们所了解的工厂模式有什么不同呢?首先构建者模式较工厂模式可以应对更繁琐负责构建工作。在构建者中有主管概念,产品不同部件可以由不同构建者来创建,构建者有点类似工厂。主管负责根据用户需求来协调整个构建者来一起完成一个复杂产品创建。

在机器学习中,一个识别系统可以由多个模型功能完成一个任务,也可以由多个模型分别完成各自任务组合后实现一个功能,例如无人驾驶中,图像识别就是不能单靠一种设备或一个模型来完成,可能需要激光扫描和摄像头共同完成一个任务,而且不同场景需要不同自有组合来对应不同场景。

image

构建者接口

image
class Builder(ABC):
​
    @abstractproperty
    def product(self) -> None:
        pass
​
    @abstractmethod
    def produce_part_screen(self) -> None:
        pass
​
    @abstractmethod
    def produce_part_camera(self) -> None:
        pass
​
    @abstractmethod
    def produce_part_battery(self) -> None:
        pass

这 builder 可以理解为一个接口(图纸),生产手机过程需要实现这个接口中所有方法的指导,才能完成一个手机产品,因为在 python 没有类似 java 的 interface 关键字来定义接口,不过可以通过 class 来实现具有接口功能的类。怎么理解 Builder 其实这是就是指导,指导如果要做手机就需要做这么几件事。

构建者的实现

现在说一说代工工厂,代工工厂会按照提供设计规范进行生产,代工根据自身条件生成手机,在构建者模式中可以有多个构建实体类。

image
class ConcreteSmartPhoneBuilder(Builder):
​
    def __init__(self) -> None:
        """
        完成产品生成对生成线进行清理恢复以便投入下一次生成
        """
        self.reset()
​
    def reset(self) -> None:
        self._product = ProductSmartPhone()
​
    @property
    def product(self) -> ProductSmartPhone:
        product = self._product
        self.reset()
        return product
​
    def produce_part_screen(self) -> None:
        self._product.add("组装屏幕")
​
    def produce_part_camera(self) -> None:
        self._product.add("组装摄像头")
​
    def produce_part_battery(self) -> None:
        self._product.add("组装电池")

产品的实现

image

这是因为手机制造这件事足够复杂,我们才会使用构建者模式而不是工厂模式来创建。与其他创建模式不同,不同的构建实体可以生成完全不相关的产品。换句话说,的结果可能不会始终遵循相同的界面。

class ProductSmartPhone():
​
    def __init__(self) -> None:
        self.parts = []
​
    def add(self, part: Any) -> None:
        self.parts.append(part)
​
    def list_parts(self) -> None:
        print(f"Product parts: {', '.join(self.parts)}", end="")

主管(Director),可以了解为手机厂商,他工作就是要求构建者按事先指定顺序去制造和组装产品。也就是严格按照图中的设计规范来制造生成手机。有点类似建筑上监理职责,好像又差点。当然这个职位也可能由客户直接参与自定义设计生成,也就是新零售中概念,用户也参与到产品研发和设计当中。那么这时就不再需要手机厂商了,代工工厂直接根据用户需求进行生成。

主管的实现

class Director:
​
    def __init__(self) -> None:
        self._builder = None
​
    @property
​    def builder(self) -> Builder:
        return self._builder
​
    @builder.setter
    def builder(self, builder: Builder) -> None:
        self._builder = builder
​
    def build_only_screen_smartphone(self) -> None:
        self.builder.produce_part_screen()
​
    def build_full_featured_smartphone(self) -> None:
        self.builder.produce_part_screen()
        self.builder.produce_part_camera()
        self.builder.produce_part_battery()

主管 (Director),也就是手机厂商,可以通过组织构建者(代工工厂不同生成线)的不同方法来实现生成不同类型的手机。其实组装产品这件事事,手机厂商是让了解手机生成流程的代工工厂去做,而非自己去做。
先创建一个 Director 接下来创建一个实现 builder 规范 ConcreteSmartPhoneBuilder 。

if __name__ == "__main__":
    """
    手机厂商只要找到代工工厂,有然后代工工厂负责组装生成产品
    """
​
    director = Director()
    builder = ConcreteSmartPhoneBuilder()
    director.builder = builder
​
    print("组装智能手机屏幕: ")
    director.build_only_screen_smartphone()
    builder.product.list_parts()
​
    print("\n")
​
    print("组装完整智能手机: ")
    director.build_full_featured_smartphone()
    builder.product.list_parts()
​
    print("\n")
​
    # Remember, the Builder pattern can be used without a Director class.
    print("定制化智能手机: ")
    builder.produce_part_screen()
    builder.produce_part_camera()
    builder.product.list_parts()

最后我们将结果输出,其实在机器学习中我们设计构建模式和此类似,这里就不再特意举一个模型构建器例子。想必大家都以根据思路自己实现。

组装智能手机屏幕: 
Product parts: 组装屏幕
​
组装完整智能手机: 
Product parts: 组装屏幕, 组装摄像头, 组装电池
​
定制化智能手机: 
Product parts: 组装屏幕, 组装摄像头%

相关文章

网友评论

    本文标题:设计模式在机器学习中应用(1)

    本文链接:https://www.haomeiwen.com/subject/ahtklktx.html