COVID-19分析:巴西各州症状发作至确认延迟估计

由于病毒的产生时间很难估计,大多数研究依赖于从临床发病间隔估计的序列间隔。考虑到亚洲金博宝大多数分析使用的是序列间隔,所以对症状的确切开始日期进行估计是至关重要的。

我用来自SIVEP Gripe的数据对巴西所有州进行了分析,完整的分析是可在这里.

在上图中,我们可以看到在巴西的每个状态的延迟伽玛平均估计。下面你可以看到里奥格兰德分布do Sul的/ RS:

188bet亚洲体育

葡萄牙COVID-19爆发的首次早期R0估计

刚刚发布了COVID-19的第一个早期估计雷诺在葡萄牙爆发(基本再生数)。图像上的详细信息,更多信息,敬请期待!这一估计是考虑到为生成间隔和生长的不确定性。

引用本文为:基督教S. Perone,“第一早期R0估计葡萄牙COVID-19的爆发,”在亚洲金博宝隐姓埋名地,14/03/2020,//www.cpetem.com/2020/03/first-early-r0-estimate-for-葡萄牙-covid-19-暴发/.

Gandiva,使用LLVM和Arrow对熊猫的表情进行JIT和评估

介绍

这是2020年后,所以新年快乐敬你们所有人!

我是LLVM的超级粉丝,11年前我开始玩LLVMJIT数据结构例如AVLs,然后JIT限制AST树以及来自TensorFlow图的JIT本机代码.此后,LLVM演变成最重要的编译器框架的生态系统之一,是由很多重要的开源项目采用了时下。

一个很酷的项目,我最近才知道的就是Gandiva. 甘地娃是由Dremio再后来捐赠给Apache的箭(德雷米奥队的荣誉)。Gandiva的主要思想是,它提供了一个编译器生成LLVM IR可以在分批操作阿帕奇箭头.Gandiva被用C ++编写,并配有很多实现构建表达式树,可以是使用JIT'ed LLVM不同的功能。这种设计的一个很好的特性是,它可以使用LLVM来自动优化复杂的表达式,增加了原生的目标平台矢量如AVX同时箭批量操作和执行本机代码,以计算表达式。

下图概述了甘地瓦:

的Gandiva如何工作的概述。图片来自:https://www.dremio.com/announcing-gandiva-initiative-for-apache-arrow

在本文中,我将构建一个非常简单的表达式解析器,它支持亚洲金博宝一组有限的操作,我将使用这些操作来过滤Pandas数据帧。

用甘地娃建立简单的表达

在本节中,我将展示如何使用来自Gandiva的tree builder手动创建一个简单的表达式。

使用Gandiva Python绑定实现JIT和expression

在为表达式构建解析器和表达式生成器之前,让我们使用Gandiva手动构建一个简单的表达式。首先,我们将创建一个简单的Pandas数据框,其数字从0.0到9.0:

将panda作为pd导入pyarrow作为pa导入皮亚罗·甘迪瓦正如gandiva#创建一个简单的Pandas数据框df=pd.数据帧({“x”:[1.0*i for i in range(10)]})表=熊猫爸爸的桌子(df)架构=来自熊猫的pa.Schema(数据框)

我们将数据帧转换为箭头表,需要注意的是,在本例中它是一个零拷贝操作,Arrow不是从Pandas复制数据并复制数据帧。后来我们得到了架构从表中,包含列类型和其他元数据。

之后,我们要使用Gandiva构建以下表达式来过滤数据:

(x>2.0)和(x<6.0)

这个表达式将使用节点从Gandiva可以了:

助洗剂= gandiva.TreeExprBuilder()#参考列的 “x” node_x = builder.make_field(table.schema.field( “×”))#提出两个文字:2.0和6.0 2 = builder.make_literal(2.0,pa.float64())6 = builder.make_literal(6.0,pa.float64())#为 “X> 2.0” gt_five_node = builder.make_function一个函数( “GREATER_THAN”,[node_x,两],pa.bool_())#创建 “×<6.0” 的函数lt_ten_node = builder.make_function( “LESS_THAN”,[node_x,六],pa.bool_())#创建一个 “和” 节点,为“(X> 2.0)和(x <6.0)” and_node = builder.make_and([gt_five_node,lt_ten_node])#使表达的条件,并创建一个过滤条件= builder.make_condition(and_node)filter_ = gandiva.make_filter(table.schema,条件)

这段代码现在看起来有点复杂,但很容易理解。我们基本上是在创建一个树的节点,它将表示我们前面显示的表达式。以下是其外观的图形表示:

检查生成的LLVM IR

不幸的是,还没有找到一种方法来转储用箭头的Python绑定生成LLVM IR,但是,我们可以只使用C ++ API构建相同的树,然后查看生成的LLVM IR:

auto field_x=field(“x”,float32());auto schema=arrow::schema({field_x});auto node_x=TreeExprBuilder::MakeField(field_x);auto two=TreeExprBuilder::MakeLiteral((float_t)2.0);auto six=TreeExprBuilder::MakeLiteral((float_t)6.0);auto gt_5节点=TreeExprBuilder::MakeFunction(“大于”,{node_x,two},arrow::boolean());auto lt嫒ten嫒u node=TreeExprBuilder::MakeFunction(“小于”、{node嫒x,six},arrow::boolean());auto and嫒node=TreeExprBuilder::MakeAnd({gt嫒u five嫒u node,lt嫒ten node});auto condition=TreeExprBuilder::MakeCondition(and嫒node);std::shared嫒ptrFilter;auto status=filte;

上面的代码与Python代码相同,但是使用C++ GANDIVAPI。现在我们在C++中构建了树,我们可以得到LLVM模块并为其转储IR代码。生成的IR充满了来自Gandiva注册表的样板代码和JIT'ed函数,但是重要的部分如下所示:

;函数Attrs:alwaysinline norecurse nounewind readnone ssp uwtable define internal zeronext i1@小于_float32_float32(float,float)本地_unnamed_addr#0{%3=fcmp olt float%0,%1 ret i1%3};函数Attrs:alwaysinline norecurse nounewind readnone ssp uwtable define internal zeronext i1@大于_float32_float32(float,000000e+00)

如您所见,在IR上我们可以看到对函数的调用less_than_float32_float_32大于浮动32这是(在本例中非常简单的)Gandiva函数来进行浮点亚洲金博宝比较。通过查看函数名前缀来注意函数的专门化。

有趣的是,LLVM将应用此代码中的所有优化,它将为目标平台生成高效的本机代码,而Godiva和LLVM将负责确保用于矢量化的扩展(如AVX)的内存对齐是正确的。

我展示的这个IR代码并不是实际执行的代码,而是经过优化的代码。在优化后的代码中,我们可以看到LLVM内联了这些函数,如下面优化代码的一部分所示:

%x、 us=加载浮点,浮点*%10,对齐4%11=fcmp ogt float%x.us,2.000000e+00%12=fcmp olt float%x.us,6.000000e+00%不是或条件=和i1%12、%11

你可以看到,表达的是现在简单多了优化后的LLVM应用其强大的优化和内联很多Gandiva funcions的。

建设有Gandiva一个熊猫过滤器表达式JIT

现在我们希望能够实现类似于熊猫的数据帧查询()使用甘地瓦函数。我们将面临的第一个问题是,我们需要解析一个字符串,比如(x>2.0)和(x<6.0),以后我们将不得不建立使用从Gandiva树构建的Gandiva表达式树,然后评估上箭头的数据表达。

现在,我将使用Python AST模块来解析有效的Python代码并为该表达式构建一个抽象语法树(AST),而不是实现对表达式字符串的完全解析,稍后我将使用它来发出Gandiva/LLVM节点。

解析字符串的繁重工作将委托给Python AST模块,我们的工作主要是在这棵树上行走,并根据该语法树发出Gandiva节点。访问此Python AST树的节点并发出Gandiva节点的代码如下所示:

LLVMGandivaVisitor类(ast.NodeVisitor公司):def初始值(self,df_table):自工作台=数据表自建造者= 甘地瓦·特雷埃克斯伯勒() 自列={f.姓名:self.builder.make_字段(f) 对于f-inself.table.schema模式} 自我比较={“Gt”:“大于”,“Lt”:“小于”,}赛尔夫·本·奥普斯={“比特币”:自建造者, “BitOr”:自制.make_或,}def visit_模块(self,node):返回自我访问(node.body节点[0])def visit_BinOp(self,node):左=自我访问(node.left节点)右=自我访问(node.右)操作名称=node.op节点.\uu类.\uuuuu名称.\uuuu gandiva_ubin_uop=赛尔夫·本·奥普斯[操作名称]返回gandiva_bin_op([左,右])def visit_Compare(self,节点):op=node.ops节点[0]操作名=操作类操作名操作名自我比较[操作名称]比较器=自我访问(节点比较器[0])左=自我访问(node.left节点)返回self.builder.make_函数(gandiva_comp_op,[左,比较器],巴布尔_()def visit_Num(self,node):返回self.builder.make_文字(节点n,pa.float64公司()def visit_Expr(self,node):返回自我访问(节点值)def visit_Name(self,node):返回自列[节点id]def generic_visit(self,node):返回节点def evaluate_filter(self,llvm_mod):条件=自建造者制造条件(llvm_mod)过滤器=甘地瓦制造过滤器(self.table.schema模式, 条件)结果=筛选评估(self.table.to_批([0],默认内存池()arr=结果到数组(pd_结果=arr.to_numpy公司()返回pd_result@staticmethod def gandiva_查询(df,查询):df_table=熊猫爸爸的桌子(df)llvm_gandiva_visitor=LLVMGandivaVisitor(df_table)mod_f=ast.parse解析(查询)llvm_mod=llvm_gandiva_访客访问(mod_f)结果=llvm_gandiva_访问者评价过滤器(llvm_mod)返回结果

正如您所看到的,代码非常简单,因为我不支持所有可能的Python表达式,而是它的一个子集。我们在这个类中所做的基本上是将Python AST节点(如亚洲金博宝Comparators和BinOps(二进制操作))转换为Gandiva节点。我还改变了&以及|分别代表和或的运算符,如在熊猫中查询()功能。

注册为熊猫分机

下一步是使用创建一个简单的熊猫扩展甘迪瓦查询()我们创建的方法:

@ pd.api.extensions.register_dataframe_accessor( “gandiva”)类GandivaAcessor:高清__init __(自我,pandas_obj):self.pandas_obj = pandas_obj高清查询(个体经营,查询):返回LLVMGandivaVisitor.gandiva_query(self.pandas_obj,查询)

就是这样,现在我们可以使用这个扩展来执行以下操作:

数据框=pd.数据帧({“a”:[1.0*i for i in range(nsize)]})结果=df.gandiva.query查询(“a>10.0”)

因为我们已经注册了一个名为甘地瓦他现在是熊猫数据帧的一等公民。

现在我们创建一个500万floats数据帧并使用新的查询()过滤方法:

数据框=pd.数据帧({“a”:[1.0*i代表范围(50000000)]})df.gandiva.query查询(“a<4.0”)#这将输出:#数组([0,1,2,3],dtype=uint32)

注意,返回的值是满足我们实现的条件的索引,因此它与Pandas不同查询()返回该数据已过滤。

我做了一些基准测试,发现Gandiva通常比Pandas更快,但是我会为下一篇关于Gandiva的文章留下适当的基准,因为这篇文章将展示如何使用它来JIT表达式。

就这样!我希望你喜欢这个职位,因为我喜欢探索甘地瓦。似乎我们将有越来越多的工具来实现Gandiva加速,特别是用于SQL解析/投影/JITing的工具。甘地瓦不仅仅是我刚才展示的,但是你现在可以开始了解它的架构以及如何构建表达树。

——克里斯蒂安·S·佩隆

引用本文为:Christian S.Perone,“Gandiva,使用LLVM和Arrow来JIT和评估熊猫的表情”,in亚洲金博宝隐姓埋名地2020年1月19日,//www.cpetem.com/2020/01/gandiva-using-llvm-and-arrow-to-jit-and-evaluate-pandas-expressions网站/.

训练过程中听神经网络梯度范数

神经网络的训练通常是通过测量许多不同的指标来完成的,如精度、损耗、梯度等。这是大部分时间聚集这些指标并在张力板上绘制可视化效果。

然而,我们还可以利用其他感官来监测神经网络的训练,例如声音. 声音是目前在神经网络训练中探索甚少的观点之一。人类的听觉可以很好地区分节奏和音高等特征上的非常小的扰动亚洲金博宝,即使这些扰动在时间上很短或很微妙。

对于这个实验,我做出示出利用各层的和用于使用不同的设置,如不亚洲金博宝同的学习率,优化器,动量上MNIST卷积神经网络训练的训练步骤中的梯度范数由合成声音一个非常简单的例子等等。

你需要安装PyAudio火把以运行该代码(在这篇文章的结尾)。

使用LR 0.01 SGD培训声

此段表示在第一个纪元的前200个步骤中使用4层渐变的训练课程,批次大小为10。音高越高,一个图层的标准值越高,表示不同批次的声音会很短。注意梯度随时间增加。

使用LR 0.1 SGD培训声

同上,但学习率较高。

使用LR 1.0 SGD培训声

与上述相同,但较高的学习速度,使网络发散,讲究高音时的规范爆炸,然后发散。

使用LR 1.0和BS 256的SGD训练声音

相同的设置,但与1.0的较高的学习率和256注梯度如何爆炸和批量大小,然后有导致最终的声音提示NaN。

使用LR 0.01与Adam一起训练声音

这是使用亚当在相同的设置作为SGD。

源代码

对于那些感兴趣的人,这里是我用来制作声音片段的全部源代码:

导入pyaudio导入numpy作为np导入wave导入torch导入火炬.nn作为nn导入torch.nn.功能作为进口火炬.optim作为torchvision导入数据集的optim,转换类Net(nn.模块):def初始化(self):超级(Net,self)自我转换1= nn.Conv2d公司(1,20,5,1)自我转换2= nn.Conv2d公司(20,50,5,(一)自我.fc1= nn.线性(4*4*50500)自我.fc2= nn.线性(500,10个)自序层= [自我转换1, 自我转换2, 自我.fc1, 自我.fc2]def forward(self,x):x=F.relu(自我转换1(x) )x=F.max_pool2d(x,2,2)x=F.relu(自我转换2(x) )x=F.max_pool2d(x,2,2)x=x.view(-1,4*4*50)x=F.relu(自我.fc1(x) )x=自我.fc2(x) 返回F.log_softmax(x,dim=1)定义开放流(fs):p=pyaudio.pyaudio()stream=p.open(格式=pyaudio.paFloat32,channels=1,rate=fs,output=True)返回p,stream def生成音调(fs,freq,duration):npsin=新罕布什尔州(2*np.pi公司* 新罕布什尔州(fs*持续时间)*freq/fs)样本=npsin.astype类型(np.float32号)返回0.1*samples def train(型号,设备,train_loader,优化器,epoch):列车模型()fs=44100 duration=0.01 f=200.0 p,stream=open_stream(fs)frames=[]对于枚举(train_loader)中的批处理idx,(data,target):data,target=数据.to(装置),目标(设备)优化器.zero_grad(输出=模型(数据)损失=F.nll_损失(输出,目标)向后损失()规范=[]用于层模型有序层:标准梯度=层重量梯度.norm()规范.append(norm_grad)音调=f+((norm_大学毕业生()*100.0)音调=色调.astype(np.float32号)samples=生成音调(fs、音调、持续时间)框架.append(示例)静默=np.0(示例.形状[0]*2,数据类型=np.float32号) 框架.append(沉默)优化器.step如果批处理idx==200:break wf=波浪式打开(“sgd_lr_1_0_bs256.wav”,“wb”)wf.setnchannels公司(一)设置采样宽度(p.获取样本尺寸(pyaudio.paFloat32)) wf.设置帧率(财政司)wf.写入文件(b''。连接(帧)wf.关闭() stream.stop_流() stream.close关闭()p.终止()定义run_main():设备=火炬装置(“cpu”)列车装载机=手电筒数据.DataLoader(数据集.MNIST('../data',train=True,download=True,转换=转换.合成([ transforms.ToTensor变换器(), 转换。规范化((0.1307,),(0.3081,))]),批处理大小=256,无序处理=真)模型=Net()。到(设备)优化器=最佳SGD(模型参数,lr=0.01,动量=0.5)对于范围(1,2)内的epoch:列车(型号、设备、列车装载机、优化器、epoch),如果uu name uuuuuuuuuuuuuuuu=“uuuu main uuuu”:run u main()
引用本文为:基督教S. Perone,“训练时听神经网络梯度规范,”在亚洲金博宝隐姓埋名地2019年8月4日,//www.cpetem.com/2019/08/listening-to-the-neural-network-gradient-norms-during-training(在训练期间)/.

用bootstrap和随机priors可视化网络集成

几个月前我发了一篇关于深度强化学习的随机先验函数,我展示了如何在Pythorch中实现培训过程以及如何从中提取模型不确定性。

使用前面显示的相同代码,下面的这些动画显示了在不同设置下对40个具有2层MLP和20个隐藏单元的模型集合的训练。这些可视化非常有助于理解使用或不使用bootstrap或随机化prior时的收敛性差异。

天真合奏

这是一个没有引导数据或添加随机先验的训练课程,只是一个幼稚的组合:

乐团与随机之前

这是集合,但添加了随机先验(具有相同架构、随机权重且固定的MLP):

$$Q{\theta_k}(x)=f{\theta_k}(x)+p_k(x)$$

最后一个模型(Q{theta k}(x)将是集合的k模型,它将与未经训练的先验函数(f{theta k}(x))相匹配:

随机先验与自举集成

这是一个具有随机先验函数和数据引导的集成:

具有固定先验和自举的集成

这是一个具有固定优先级(Sin)和引导的集成:

引用这篇文章为:Christian S.Perone,在亚洲金博宝隐姓埋名地2019年7月20日,//www.cpetem.com/2019/07/visualize-network-ensembles-with-bootstrap-and-randogram-priors网站/.

深度学习中的不确定性估计(PyData Lisbon/2019年7月)

只是分享一些我于2019年7月在里斯本的PyData演讲的幻灯片”深度学习中的不确定性估计“:

引用本文为:Christian S.Perone,“深度学习中的不确定性估计(PyData Lisbon/2019年7月),”亚洲金博宝隐姓埋名地,18/07/2019,//www.cpetem.com/2019/07/uncertainty-estimation-in-deep-learning-pydata-lisbon-july-2019/.