wenyan
wenyan copied to clipboard
【炼丹之术】用文言开发深度学习网络
Motivation
#146 Wenyan for deep learning framework Thanks @TheWisp for his/her wonderful idea. Here's my take on a wenyan deep learning framework that simulates Pytorch. Feel free to comment on my work or even diss me:)
Build a network
吾观一书,名曰「火炬心法」 # torch
自「火炬心法」之书 引「炼法」之篇,「备料」之篇,「丹器」之篇
自「火炬心法」之书 引「檀瑟」之器 # tensor
自「火炬心法」之书「备料」之篇 引「料堆」,「料铲」
自「火炬心法」之书「丹器」之篇引「丹炉」之器,「高炉」之器
吾观一书,名曰「火眼金睛」 # torchvision
自「火眼金睛」之书「备料」之篇引「缩放」之术,「中和」之术,「翻转」之术
吾有一术。名曰「川流」。欲行是术。
必先得一列。曰「诸炉」。列中诸元。皆为「丹炉」。
吾有一术。名曰「高炉」。欲行是术。
必先得一「檀瑟」之器。名曰「料」。
凡「诸炉」中之各「层」。
施「层」之术于「料」。赋还其身 # x = t(x)
乃得「料」也。
乃得「高炉」之术。
是谓「川流」之术也。
批曰。吾人欲炼金丹,需先造丹炉
吾有一丹炉。名曰「八卦炉」。欲造此炉。
必先得四数。
曰「入」。其值原应为三。
曰「类」。其值原应为十。
曰「料尺」。其值原应为廿八。
曰「通数」。其值原应为六十有四。
必先得两爻。
曰「弃乎」。其值原应为阳。
曰「归一乎」。其值原应为阳。
乃造此炉如下。
造「八卦炉」之「基座」 #super(...,self).__init__()
吾有两数。曰「前通」。曰「后通」。
昔之「前通」者。今「通数」是矣。
昔之「后通」者。今「通数」是矣。
吾有一列。曰「方炉」。
充「方炉」以「卷积」之层。其形制如下。
进口「入」个,出口「后通」个。「核」长宽各七。入料时「镶边」各三。每隔一「步」炼之
充「方炉」以「池化」之层。其形制如下。
凡每一进口。取邻域长宽各「二」。采其「均值」。
充「方炉」以「激活」之层。其形制如下。
凡入之诸元,取其值与零之大者赋之
昔之「前通」者,今「后通」是矣。
乘「后通」以二。
除「料尺」以二。
充「方炉」以「卷积」之层。其形制如下。
进口「前通」个,出口「后通」个。「核」长宽各三。入料时「镶边」各一。每隔一「步」炼之
充「方炉」以「池化」之层。其形制如下。
凡每一进口。取邻域长宽各「二」。采其「均值」。
充「方炉」以「激活」之层。其形制如下。
凡入之诸元,取其值与零之大者赋之
除「料尺」以二。
施「川流」之术于「方炉」。得一「高炉」。名之曰「特征」
乘「后通」以「料尺」以「料尺」。记之曰「入维」
吾有一列。曰「线炉」。
充「线炉」以「线性」之层。其形制如下。
进口长曰「入维」,出口长曰「类」。 批曰。如何添加bias
若「弃乎」为阳。
充「线炉」以「阻滞」之层。其功用如下。
随缘关闭炉内通道。只留其「半数」。
若「归一乎」为阳。
充「线炉」以「归一」之层。其实现如下。
凡「入料」中之「物」。皆取幂。得一列。记之曰「概率」
施「列和」之数于「概率」之列。得一数。记之曰「幂和」
凡「概率」中之「数」。除「数」以「幂和」。 批曰。易证「概率」之「列和」为一也
施「川流」之术于「线炉」。得一「高炉」。名之曰「预测」
至此。炉乃成。
此炉有「炼丹术」。欲行是术。必先得一「檀瑟」之器。名曰「入料」。
乃行「炼丹术」如下。
观「入料」之形,得一列。名之曰「尺寸」
若夫「尺寸」之长 不为「四」或 「尺寸」之三 其值不为 廿八:
警云「「入料与丹炉方圆不合,慎之慎之!」」
「入料」进「特征」之炉炼之。产物记之曰「中料」
施「整形」之术于「中料」。
「中料」进「预测」之炉炼之。产物记之曰「出品」
乃得「出品」。
是谓「炼丹术」也。
如此「八卦炉」乃成。
And here is the corresponding Pytorch script:
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! 可读性感觉很好啊,虽然编译不了但是让人一看就知道什么意思
tried compile and got error:
node ./build/wenyan.js -l py bg.wy -o bgg.js
[Syntax Error] Expecting type for variable type, found data
Line 10, Character 1:吾有一术。名曰「川流」。欲行是术
tried compile and got error:
node ./build/wenyan.js -l py bg.wy -o bgg.js
[Syntax Error] Expecting type for variable type, found data Line 10, Character 1:吾有一术。名曰「川流」。欲行是术
@LingDong- Hey are you gonna help a poor man with his needs or wha' lol
牛皮,逻辑清晰,可读性很高。
不就是膝盖
🐂🍵
很武侠的感觉啊,小说中符文密咒的原型找到了(joke
标签的 stdlib 是钦定了么?
哇这个代码看得我心潮澎湃 感觉我的中二之魂在熊熊燃烧
哇这个代码看得我心潮澎湃 感觉我的中二之魂在熊熊燃烧
+1
绝了哈哈哈哈,炼丹之术造人可是禁忌之术。 Interesting.
牛批兄弟,因吹斯听,有没有JavaScript的脚本,我们是做前端的,不会java什么的,还有没有别的好玩的,分享分享,蟹蟹