专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

使用JAX实现完整的VisionTransformer

  本文将展示如何使用JAXFlax实现VisionTransformer(ViT),以及如何使用JAXFlax训练ViT。VisionTransformer
  在实现VisionTransformer时,首先要记住这张图。
  以下是论文描述的ViT执行过程。
  从输入图像中提取补丁图像,并将其转换为平面向量。
  投影到TransformerEncoder来处理的维度
  预先添加一个可学习的嵌入(〔class〕标记),并添加一个位置嵌入。
  由TransformerEncoder进行编码处理
  使用〔class〕令牌作为输出,输入到MLP进行分类。细节实现
  下面,我们将使用JAXFlax创建每个模块。
  1、图像到展平的图像补丁
  下面的代码从输入图像中提取图像补丁。这个过程通过卷积来实现,内核大小为patchsizepatchsize,stride为patchsizepatchsize,以避免重复。classPatches(nn。Module):patchsize:intembeddim:intdefsetup(self):self。convnn。Conv(featuresself。embeddim,kernelsize(self。patchsize,self。patchsize),strides(self。patchsize,self。patchsize),paddingVALID)defcall(self,images):patchesself。conv(images)b,h,w,cpatches。shapepatchesjnp。reshape(patches,(b,hw,c))returnpatches
  2和3、对展平补丁块的线性投影添加〔CLS〕标记位置嵌入
  TransformerEncoder对所有层使用相同的尺寸大小hiddendim。上面创建的补丁块向量被投影到hiddendim维度向量上。与BERT一样,有一个CLS令牌被添加到序列的开头,还增加了一个可学习的位置嵌入来保存位置信息。classPatchEncoder(nn。Module):hiddendim:intnn。compactdefcall(self,x):assertx。ndim3n,seqlen,x。shapeHiddendimxnn。Dense(self。hiddendim)(x)Addclstokenclsself。param(clstoken,nn。initializers。zeros,(1,1,self。hiddendim))clsjnp。tile(cls,(n,1,1))xjnp。concatenate(〔cls,x〕,axis1)Addpositionembeddingposembedself。param(positionembedding,nn。initializers。normal(stddev0。02),FromBERT(1,seqlen1,self。hiddendim))returnxposembed
  4、Transformerencoder
  如上图所示,编码器由多头自注意(MSA)和MLP交替层组成。Norm层(LN)在MSA和MLP块之前,残差连接在块之后。classTransformerEncoder(nn。Module):embeddim:inthiddendim:intnheads:intdropp:floatmlpdim:intdefsetup(self):self。mhaMultiHeadSelfAttention(self。hiddendim,self。nheads,self。dropp)self。mlpMLP(self。mlpdim,self。dropp)self。layernormnn。LayerNorm(epsilon1e6)defcall(self,inputs,trainTrue):AttentionBlockxself。layernorm(inputs)xself。mha(x,train)xinputsxMLPblockyself。layernorm(x)yself。mlp(y,train)returnxy
  MLP是一个两层网络。激活函数是GELU。本文将Dropout应用于Dense层之后。classMLP(nn。Module):mlpdim:intdropp:floatoutdim:Optional〔int〕Nonenn。compactdefcall(self,inputs,trainTrue):actualoutdiminputs。shape〔1〕ifself。outdimisNoneelseself。outdimxnn。Dense(featuresself。mlpdim)(inputs)xnn。gelu(x)xnn。Dropout(rateself。dropp,deterministicnottrain)(x)xnn。Dense(featuresactualoutdim)(x)xnn。Dropout(rateself。dropp,deterministicnottrain)(x)returnx
  多头自注意(MSA)
  qkv的形式应为〔B,N,T,D〕,如SingleHead中计算权重和注意力后,应输出回原维度〔B,T,CND〕。classMultiHeadSelfAttention(nn。Module):hiddendim:intnheads:intdropp:floatdefsetup(self):self。qnetnn。Dense(self。hiddendim)self。knetnn。Dense(self。hiddendim)self。vnetnn。Dense(self。hiddendim)self。projnetnn。Dense(self。hiddendim)self。attdropnn。Dropout(self。dropp)self。projdropnn。Dropout(self。dropp)defcall(self,x,trainTrue):B,T,Cx。shapebatchsize,seqlength,hiddendimN,Dself。nheads,Cself。nheadsnumheads,headdimqself。qnet(x)。reshape(B,T,N,D)。transpose(0,2,1,3)(B,N,T,D)kself。knet(x)。reshape(B,T,N,D)。transpose(0,2,1,3)vself。vnet(x)。reshape(B,T,N,D)。transpose(0,2,1,3)weights(B,N,T,T)weightsjnp。matmul(q,jnp。swapaxes(k,2,1))math。sqrt(D)normalizedweightsnn。softmax(weights,axis1)attention(B,N,T,D)attentionjnp。matmul(normalizedweights,v)attentionself。attdrop(attention,deterministicnottrain)gatherheadsattentionattention。transpose(0,2,1,3)。reshape(B,T,ND)projectoutself。projdrop(self。projnet(attention),deterministicnottrain)returnout
  5、使用CLS嵌入进行分类
  最后MLP头(分类头)。classViT(nn。Module):patchsize:intembeddim:inthiddendim:intnheads:intdropp:floatnumlayers:intmlpdim:intnumclasses:intdefsetup(self):self。patchextracterPatches(self。patchsize,self。embeddim)self。patchencoderPatchEncoder(self。hiddendim)self。dropoutnn。Dropout(self。dropp)self。transformerencoderTransformerEncoder(self。embeddim,self。hiddendim,self。nheads,self。dropp,self。mlpdim)self。clsheadnn。Dense(featuresself。numclasses)defcall(self,x,trainTrue):xself。patchextracter(x)xself。patchencoder(x)xself。dropout(x,deterministicnottrain)foriinrange(self。numlayers):xself。transformerencoder(x,train)MLPheadxx〔:,0〕〔CLS〕tokenxself。clshead(x)returnx使用JAXFlax训练
  现在已经创建了模型,下面就是使用JAXFlax来训练。
  数据集
  这里我们直接使用torchvision的CIFAR10。
  首先是一些工具函数defimagetonumpy(img):imgnp。array(img,dtypenp。float32)img(img255。DATAMEANS)DATASTDreturnimgdefnumpycollate(batch):ifisinstance(batch〔0〕,np。ndarray):returnnp。stack(batch)elifisinstance(batch〔0〕,(tuple,list)):transposedzip(batch)return〔numpycollate(samples)forsamplesintransposed〕else:returnnp。array(batch)
  然后是训练和测试的dataloadertesttransformimagetonumpytraintransformtransforms。Compose(〔transforms。RandomHorizontalFlip(),transforms。RandomResizedCrop((IMAGESIZE,IMAGESIZE),scaleCROPSCALES,ratioCROPRATIO),imagetonumpy〕)Validationsetshouldnotusetheaugmentation。traindatasetCIFAR10(data,trainTrue,transformtraintransform,downloadTrue)valdatasetCIFAR10(data,trainTrue,transformtesttransform,downloadTrue)trainset,torch。utils。data。randomsplit(traindataset,〔45000,5000〕,generatortorch。Generator()。manualseed(SEED)),valsettorch。utils。data。randomsplit(valdataset,〔45000,5000〕,generatortorch。Generator()。manualseed(SEED))testsetCIFAR10(data,trainFalse,transformtesttransform,downloadTrue)trainloadertorch。utils。data。DataLoader(trainset,batchsizeBATCHSIZE,shuffleTrue,droplastTrue,numworkers2,persistentworkersTrue,collatefnnumpycollate,)valloadertorch。utils。data。DataLoader(valset,batchsizeBATCHSIZE,shuffleFalse,droplastFalse,numworkers2,persistentworkersTrue,collatefnnumpycollate,)testloadertorch。utils。data。DataLoader(testset,batchsizeBATCHSIZE,shuffleFalse,droplastFalse,numworkers2,persistentworkersTrue,collatefnnumpycollate,)
  初始化模型
  初始化ViT模型definitializemodel(seed42,patchsize16,embeddim192,hiddendim192,nheads3,dropp0。1,numlayers12,mlpdim768,numclasses10):mainrngjax。random。PRNGKey(seed)xjnp。ones(shape(5,32,32,3))ViTmodelViT(patchsizepatchsize,embeddimembeddim,hiddendimhiddendim,nheadsnheads,droppdropp,numlayersnumlayers,mlpdimmlpdim,numclassesnumclasses)mainrng,initrng,droprngrandom。split(mainrng,3)paramsmodel。init({params:initrng,dropout:droprng},x,trainTrue)〔params〕returnmodel,params,mainrngvitmodel,vitparams,vitrnginitializemodel()
  创建TrainState
  在Flax中常见的模式是创建管理训练的状态的类,包括轮次、优化器状态和模型参数等等。还可以通过在applyfn中指定applyfn来减少学习循环中的函数参数列表,applyfn对应于模型的前向传播。defcreatetrainstate(model,params,learningrate):optimizeroptax。adam(learningrate)returntrainstate。TrainState。create(applyfnmodel。apply,txoptimizer,paramsparams)statecreatetrainstate(vitmodel,vitparams,3e4)
  循环训练deftrainmodel(trainloader,valloader,state,rng,numepochs100):besteval0。0forepochidxintqdm(range(1,numepochs1)):state,rngtrainepoch(trainloader,epochidx,state,rng)ifepochidx10:evalaccevalmodel(valloader,state,rng)logger。addscalar(valacc,evalacc,globalstepepochidx)ifevalaccbesteval:bestevalevalaccsavemodel(state,stepepochidx)logger。flush()Evaluateaftertrainingtestaccevalmodel(testloader,state,rng)print(ftestacc:{testacc})deftrainepoch(trainloader,epochidx,state,rng):metricsdefaultdict(list)forbatchintqdm(trainloader,descTraining,leaveFalse):state,rng,loss,acctrainstep(state,rng,batch)metrics〔loss〕。append(loss)metrics〔acc〕。append(acc)forkeyinmetrics。keys():argvalnp。stack(jax。deviceget(metrics〔key〕))。mean()logger。addscalar(trainkey,argval,globalstepepochidx)print(f〔epoch{epochidx}〕{key}:{argval})returnstate,rng
  验证defevalmodel(dataloader,state,rng):Testmodelonallimagesofadataloaderandreturnavglosscorrectclass,count0,0forbatchindataloader:rng,accevalstep(state,rng,batch)correctclassaccbatch〔0〕。shape〔0〕countbatch〔0〕。shape〔0〕evalacc(correctclasscount)。item()returnevalacc
  训练步骤
  在trainstep中定义损失函数,计算模型参数的梯度,并根据梯度更新参数;在valueandgradients方法中,计算状态的梯度。在applygradients中,更新TrainState。交叉熵损失是通过applyfn(与model。apply相同)计算logits来计算的,applyfn是在创建TrainState时指定的。jax。jitdeftrainstep(state,rng,batch):lossfnlambdaparams:calculateloss(params,state,rng,batch,trainTrue)Getloss,gradientsforloss,andotheroutputsoflossfunction(loss,(acc,rng)),gradsjax。valueandgrad(lossfn,hasauxTrue)(state。params)Updateparametersandbatchstatisticsstatestate。applygradients(gradsgrads)returnstate,rng,loss,acc
  计算损失defcalculateloss(params,state,rng,batch,train):imgs,labelsbatchrng,droprngrandom。split(rng)logitsstate。applyfn({params:params},imgs,traintrain,rngs{dropout:droprng})lossoptax。softmaxcrossentropywithintegerlabels(logitslogits,labelslabels)。mean()acc(logits。argmax(axis1)labels)。mean()returnloss,(acc,rng)结果
  训练结果如下所示。在Colabpro的标准GPU上,训练时间约为1。5小时。
  testacc:0。7704000473022461
  作者:satojkovic

实拍马自达3昂克赛拉黑曜版,颜值出众,或搭2。0L24V轻混动力最近几年马自达在国内市场占有率不断萎靡,声势上较之日系三驾马车存在巨大差距。不过其还是拥有一众拥趸,毕竟当年马自达6也是街车一般的存在。日前,马自达3昂克赛拉黑曜版实车曝光,引发多卫报什么样的身材穿什么样的衣着按漂亮和实用选择中国小康网7月26日讯老马时尚学者ElizabethKealyMorris博士将衣着选择描述为身体着装工作。她回忆起10岁患有脊柱侧弯的少年时期穿衣服时的情景,描述了她在既漂亮又实妇科腹腔镜手术用什么体位和麻醉?今天,小洁在生理期过后,请好假来准备做腹腔镜手术了,我担心她紧张,想把手术的过程和相关的事宜与她一一分享。她问腹腔镜手术时疼不疼啊?是半麻还是全麻?我说腹腔镜手术时常常使用的麻醉方毛主席的遗体为何至今栩栩如生?韩伯平揭晓真相,不只是药物作用1976年是新中国至暗的一年,这一年三星陨落,三位伟人相继离开了他们深爱的人民。1976年9月9日0时10分,毛泽东病逝于北京。毛主席的遗体至今都栩栩如生地保存在纪念堂里,众所周知吴啊萍被我找到了,高中就想死,靠药物入睡吴啊萍被我找到了。捐款名字上第一个是张井上,第二个就是吴啊萍,张井上三万元,吴啊萍一万五千元。这两个人是捐款最多的人,几万元说损就捐,特别是一个连工作都没有的人,这是不是太奇怪了。长期吃六味地黄丸的人,身体怎么样了?4个变化或许会等着你物质生活水平的提高,越来越多的人注重养生,中成药也成了多数养生人士关注的焦点。这种药物的副作用要比西药小,所以很多人一旦身体出现问题,会选择用中药调理。生活中常见的中成药很多,其中为啥不能随便喝黄芪水?特别提醒3类人不宜饮用,建议了解下李女士这段时间不知怎么回事,经常出汗,还总觉得疲惫不堪,浑身乏力。朋友告诉李女士,这可能是气虚导致的,多喝点黄芪水就好了。于是,李女士就抱着半信半疑的想法买了点黄芪泡水喝。过了一段夺去赵忠祥生命的鳞状细胞癌是啥?听起来陌生,其实很常见提起鳞状细胞癌,可能部分人并不陌生,著名主持人赵忠祥先生就是因鳞状细胞癌病逝,之后鳞状细胞癌就进入了大众的视野中。可能这类疾病的名字生活中很少被提起,但是其也属于恶性肿瘤的一种,虽不可一世的景甜,为何走到了今天?一hr1988年7月21日景甜出生于陕西省西安市一个中等家庭!年幼的景甜体弱多病,但是她却在跳舞唱歌上很有艺术天赋,所以在景甜很小的时候她就被父母送到了少年宫学习舞蹈,后来还加入了印媒中国年度战机产量创世界纪录,飞行员扩招大幅提升战力储备印媒欧亚时报表示,在中国创下年度战机产量记录后,为了快速扩充空军的整体实力,中国空军飞行员大幅度扩招,并且缩短结业时间,以提升战力储备和提升解放军空军的综合实力。对此,空军招收了大毒奶粉女王三鹿董事长快出狱了,30万受害的孩子后来怎样了?提起毒奶粉三个字,如今人们很自然会想起三鹿奶粉。在三鹿奶粉2008年曝光为毒奶粉之前,三鹿集团在国内奶制品的地位,几乎是行业老大。随着三聚氰胺事件的曝光,三鹿集团面临着巨额赔偿,在
父亲把房产都过户给了儿子,女儿得知此事后,直接将父亲赶出家门范女士今年42岁,这些年她68岁的父亲一直跟着她居住,所有开销也由于她承担,因为将父亲接到自家居住多年,范女士的丈夫还曾多次提出离婚!她本来并没有想过和弟弟争夺房产,但范女士发现父走进马尔代夫,一夫多妻,带你看看这个亚洲袖珍国家马尔代夫,是亚洲最小的国家,国土面积不到300平方公里,比中国的一个县还小。马尔代夫位于印度洋,靠近印度,距离大约有600公里,境内有1192个珊瑚岛,其中只有200个小岛有人居住牛亡爷恩克一天3顿肉,朋友蹭饭引妻子不满,网友交友不慎引子网红胖猴仔进入减肥训练营后,已经瘦到了400斤左右,肉眼可见的瘦了一大圈。瘦了之后,整个人精神都变好了。现在这个社会虽然提倡以瘦为美,但身体健康,身材匀称才是众人该追求的,不能孙殿英当土匪挖清陵,让人没想到,他儿子却是个万人敬仰的大人物要说盗墓军阀,孙殿英敢认第二,那全一人敢认第一。孙殿英当土匪,盗掘清东陵,是个毁誉参半的人物,但是令很多人没有想到,孙殿英的儿子,却是一个受万人景仰的大人物。土匪军阀孙殿英1889广州放飞500万只绝育亚洲虎蚊!专门交配,对人体有攻击性吗?夏天到了,全世界人最讨厌的动物开始大肆出没了,没错,就是最招人烦的蚊子。而且夏天是蚊子攻击性最强的时候,所以人们对蚊子的狠可以说已经刻在骨子里了。但是最近广州黄埔区最大的蚊子工厂却这个香港名媛圈,个个身家过亿,吕良伟甄子丹妻子都在列香港名媛圈子很多,每一位都非富即贵,而这个香港名媛圈,其中不乏大家很熟悉的明星们。之前某名媛晒出一组派对照,照片中的几位名媛,都是大家的熟人,有甄子丹的老婆汪诗诗任达华的妻子琦琦大这些二手车直播操作?到底是为了流量还是博眼球?一个为了消费者维权的重庆车商一步一步成为了重庆车商顶流但是后来呢,因为一辆事故车的问题上演了一出引爆车圈的大戏直播铲耳屎(掌掴)结果也是鼻血横飞端午节也上演了一出好戏云南的二手车商物流保通保畅丨安徽全力护航三夏生产运输保障手中有粮,心中不慌。夏粮是全年粮食生产的第一季,只有全力夺取夏粮丰收,端稳中国饭碗才更有底。又到一年一度的三夏生产时间,为统筹做好农机车辆通行和疫情防控服务保障工作,努力夺取夏粮丰时代变了!美国召开美洲峰会没人来,后花园已转向与中国合作从6月6日到6月10日,备受瞩目的第九届美洲峰会将在美国洛杉矶举行,按照惯例,美国加拿大墨西哥以及南美和加勒比国家将会在大会上齐聚一堂,商讨国家大事,此次峰会对美国意义重大。这不仅神十四发射成功,外网给出高评价,日韩网友更是羡慕不已2022年6月5日10时44分,我国神舟十四号载人飞船发射成功,举国欢庆。关于我国2022年的航天计划中,将完成中国空间站在轨建造,计划实施6次飞行任务,其中就包括刚刚发射成功的神50!巨星闪耀夜梅西5球,C罗双响,贝尔圆梦世界杯6月6日凌晨,世界足坛多场焦点大战开打。这个足球之夜,梅西C罗贝尔3大80后巨星,都交出令人惊叹的答卷贝尔率领威尔士杀进世界杯,梅西单场轰进5球,C罗也有4分钟双响的精彩表演!大圣
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网