专栏首页新智元吾有一术,名曰炼丹。北大博士生用文言开发深度学习网络,还有Pytorch脚本

吾有一术,名曰炼丹。北大博士生用文言开发深度学习网络,还有Pytorch脚本

新智元报道

来源:GitHub

编辑:小芹

【新智元导读】文言编程语言/wenyan-lang火了,GitHub项目已经超过12.7K stars。最近,一位北大博士生似乎找到了wenyan-lang的正确用法——开发深度学习网络,名曰「炼丹」。其代码逻辑清晰、可读性高,真乃神人也。戳右边链接上 新智元小程序 了解更多!

最近文言编程语言 / wenyan-lang火了——GitHub项目已经超过12.7K Stars。

设计文言编程语言的是CMU大四学生Lingdong Huang,真乃后生可畏!

根据Lingdong同学的介绍,wenyan-lang有以下特点:

  • 符合古汉语语法的自然语言处理程序
  • 可以编译成 JavaScript,Python,或者 Ruby
  • 图灵完备
  • 在线 IDE,即刻体验
  • 通过几个例子快速入门

而且,这个编程语言只包含中文和引用符号「」,所以古人也看得懂 。它的变量定义是这样的:

语法里基本控制流程判断、循环也一应俱全。wenyan-lang还提供了在线IDE,包括斐波那契数列、快排、汉诺塔等许多例子供参考学习:

现在,有人似乎找到了 wenyan-lang 的正確用法:用文言开发深度学习网络,名曰炼丹

用文言开发深度学习网络,名曰炼丹

用wenyan-lang编写深度学习网络的这位神人是北大学生杨凌波(Lingbo Yang),他于2016年在北京大学获得了数学学士学位,目前正在数字视频编解码技术国家工程实验室攻读博士学位。

我们来看一下构建一个神经网络的“文言”代码:

吾观一书,名曰「火炬心法」  # torch
自「火炬心法」之书 引「炼法」之篇,「备料」之篇,「丹器」之篇
自「火炬心法」之书 引「檀瑟」之器  # tensor
自「火炬心法」之书「备料」之篇 引「料堆」,「料铲」
自「火炬心法」之书「丹器」之篇引「丹炉」之器,「高炉」之器

吾观一书,名曰「火眼金睛」  # torchvision
自「火眼金睛」之书「备料」之篇引「缩放」之术,「中和」之术,「翻转」之术

吾有一术。名曰「川流」。欲行是术。
    必先得一列。曰「诸炉」。列中诸元。皆为「丹炉」。

    吾有一术。名曰「高炉」。欲行是术。
        必先得一「檀瑟」之器。名曰「料」。
            凡「诸炉」中之各「层」。
                施「层」之术于「料」。赋还其身  # x = t(x)
            乃得「料」也。

    乃得「高炉」之术。
是谓「川流」之术也。

批曰。吾人欲炼金丹,需先造丹炉
吾有一丹炉。名曰「八卦炉」。欲造此炉。
    必先得四数。
        曰「入」。其值原应为三。
        曰「类」。其值原应为十。
        曰「料尺」。其值原应为廿八。
        曰「通数」。其值原应为六十有四。

    必先得两爻。
        曰「弃乎」。其值原应为阳。
        曰「归一乎」。其值原应为阳。

    乃造此炉如下。
        造「八卦炉」之「基座」  #super(...,self).__init__()

        吾有两数。曰「前通」。曰「后通」。
        昔之「前通」者。今「通数」是矣。
        昔之「后通」者。今「通数」是矣。
        吾有一列。曰「方炉」。
            充「方炉」以「卷积」之层。其形制如下。
                进口「入」个,出口「后通」个。「核」长宽各七。入料时「镶边」各三。每隔一「步」炼之
            充「方炉」以「池化」之层。其形制如下。
                凡每一进口。取邻域长宽各「二」。采其「均值」。
            充「方炉」以「激活」之层。其形制如下。
                凡入之诸元,取其值与零之大者赋之

            昔之「前通」者,今「后通」是矣。
            乘「后通」以二。
            除「料尺」以二。

            充「方炉」以「卷积」之层。其形制如下。
                进口「前通」个,出口「后通」个。「核」长宽各三。入料时「镶边」各一。每隔一「步」炼之
            充「方炉」以「池化」之层。其形制如下。
                凡每一进口。取邻域长宽各「二」。采其「均值」。
            充「方炉」以「激活」之层。其形制如下。
                凡入之诸元,取其值与零之大者赋之

            除「料尺」以二。

        施「川流」之术于「方炉」。得一「高炉」。名之曰「特征」

        乘「后通」以「料尺」以「料尺」。记之曰「入维」
        吾有一列。曰「线炉」。
            充「线炉」以「线性」之层。其形制如下。
                进口长曰「入维」,出口长曰「类」。批曰。如何添加bias
            若「弃乎」为阳。
                充「线炉」以「阻滞」之层。其功用如下。
                    随缘关闭炉内通道。只留其「半数」。
            若「归一乎」为阳。
                充「线炉」以「归一」之层。其实现如下。
                    凡「入料」中之「物」。皆取幂。得一列。记之曰「概率」
                    施「列和」之数于「概率」之列。得一数。记之曰「幂和」
                    凡「概率」中之「数」。除「数」以「幂和」。批曰。易证「概率」之「列和」为一也

        施「川流」之术于「线炉」。得一「高炉」。名之曰「预测」
    至此。炉乃成。

    此炉有「炼丹术」。欲行是术。必先得一「檀瑟」之器。名曰「入料」。
        乃行「炼丹术」如下。

        观「入料」之形,得一列。名之曰「尺寸」
        若夫「尺寸」之长 不为「四」或 「尺寸」之三 其值不为 廿八:
            警云「「入料与丹炉方圆不合,慎之慎之!」」

        「入料」进「特征」之炉炼之。产物记之曰「中料」
        施「整形」之术于「中料」。
        「中料」进「预测」之炉炼之。产物记之曰「出品」
        乃得「出品」。
    是谓「炼丹术」也。

如此「八卦炉」乃成。

对应的Pytorch脚本如下:

import torch
from torch import nn, optim, data
from torch.data.utils import Dataset, DataLoader
from torch.nn import Module, Sequential

def sequential(*layers):
    def _chain_process(x -> torch.Tensor):
        for l in layers:
            x = l(x)
        return x

    return _chain_process

# We're gonna build a large furnace for alchemic experiments
class BaGuaFurnace(nn.Module):
    def __init__(self, 
        dim=3, class_num=10, im_size=28, nf=64,
        use_dropout=True, use_sigmoid=False):
        super(BaGuaFurnace, self).__init__()

        indim, outdim = dim
        conv = [
            nn.Conv2d(dim, outdim, kernel_size=7, padding=3, stride=1),
            nn.AvgPool2d(stride=2),
            nn.ReLU(),
        ]
        indim, outdim = outdim, outdim * 2
        im_size = im_size // 2
        conv += [
            nn.Conv2d(indim, outdim, kernel_size=3, padding=1, stride=1),
            nn.AvgPool2d(stride=2),
            nn.ReLU(),
        ]
        im_size = im_size // 2
        self.feature = sequential(*conv)

        fc_indim = im_size * im_size * outdim
        fc = [nn.Linear(fc_indim, class_num, use_bias=True)]
        if use_dropout:
            fc += [nn.Dropout(0.5)]
        if use_sigmoid:
            fc += [nn.Sigmoid()]
        self.predict = sequential(*fc)

    def forward(self, in):
        shape = mid.size()
        if len(shape) != 4 or shape[3] != 28:
            raise(Warning('Oi, wrong size!'))
        mid = self.feature(in)
        mid = mid.view(shape[0], -1)
        out = self.predict(mid)
        return out

真乃“洋为中用,古为今用”也,厉害厉害!

围观的小伙伴纷纷献上膝盖:

Very nice! 可读性感觉很好啊,虽然编译不了但是让人一看就知道什么意思

牛皮,逻辑清晰,可读性很高。

感兴趣的同学戳原文链接可前往GitHub页面围观。

wenyan-lang项目:

https://github.com/LingDong-/wenyan-lang

本文分享自微信公众号 - 新智元(AI_era)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-12-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 158行代码!程序员复现DeepMind图像生成神器

    递归神经网络是一种用于图像生成的神经网络结构。Draw Networks 结合了一种新的空间注意机制,该机制模拟了人眼的中心位置,采用了一个顺序变化的自动编码框...

    新智元
  • 图灵奖得主牵头推动芯片开源,清华伯克利成立RISC-V国际实验室

    目前芯片市场由英特尔、AMD、ARM、高通等厂商把持,前一阵子各大芯片厂商陆续停止向华为供货,导致华为的“备胎”纷纷被迫转正。多亏了任正非的远见,华为十年前就开...

    新智元
  • 【震撼】这些专业级摄影作品竟然出自谷歌神经网络之手!

    【新智元导读】谷歌研究人员提出利用机器学习学习“主观”概念的新方法,模仿专业摄影师的工作流程,遍览谷歌街景地图并搜索最佳作品,然后进行各种后续的处理,创造出媲美...

    新智元
  • EventBus源码分析之发布流程

    继上篇文章EventBus源码分析之订阅流程之后,继续介绍EventBus的发布,事件发送完,EventBus如何做到调用之前注册的方法。

    用户1108631
  • Master-work模式

    ①.master负责手机客户端的请求,将任务分发给work,回收work处理结果, ②.work做具体的业务逻辑,并将结果通知到master 这里做了一个给每个...

    用户1215919
  • 设计模式之单例模式讲解设计模式之单例模式讲解

    Singleton是一种创建型模式,指某个类采用Singleton模式,则在这个类被创建后,只可能产生一个实例供外部访问,并且提供一个全局的访问点

    yukong
  • object __new__函数

    用户1733462
  • P06_flume-ng-1.5.0-cdh5.3.6安装

    安装flume 1、将课程提供的flume-ng-1.5.0-cdh5.3.6.tar.gz使用WinSCP拷贝到sparkproject1的/usr/loca...

    Albert陈凯
  • FreeRTOS 信号量

    FreeRTOS 信号量和互斥锁是基于队列实现的, 队列介绍见 << FreeRTOS 消息队列 >>。 使用信号量需要在源文件中包含头文件 semphr....

    orientlu
  • ES6系列_7之箭头函数和扩展

    ES6中我们直接用throw new Error( xxxx ),就可以抛出错误。

    wfaceboss

扫码关注云+社区

领取腾讯云代金券