求决策树源代码。最好使用matlab实现。
function [Tree RulesMatrix]=DecisionTree(DataSet,AttributName)
%输入为训练集,为离散后的数字,如记录1:1 1 3 2 1;
%前面为属性列,最后一列为类标
if nargin<1
error('请输入数据集');
else
if isstr(DataSet)
[DataSet AttributValue]=readdata2(DataSet);
else
AttributValue=[];
end
end
if nargin<2
AttributName=[];
end
Attributs=[1:size(DataSet,2)-1];
Tree=CreatTree(DataSet,Attributs);
disp([char() 'The Decision Tree:']);
showTree(Tree,0,0,1,AttributValue,AttributName);
Rules=getRule(Tree);
RulesMatrix=zeros(size(Rules,1),size(DataSet,2));
for i=1:size(Rules,1)
rule=cell2struct(Rules(i,1),{ 'str'});
rule=str2num([rule.str([1:(find(rule.str=='C')-1)]) rule.str((find(rule.str=='C')+1):length(rule.str))]);
for j=1:(length(rule)-1)/2
RulesMatrix(i,rule((j-1)*2+1))=rule(j*2);
end
RulesMatrix(i,size(DataSet,2))=rule(length(rule));
end
end
function Tree=CreatTree(DataSet,Attributs) %决策树程序 输入为:数据集,属性名列表
%disp(Attributs);
[S ValRecords]=ComputEntropy(DataSet,0);
if(S==0) %当样例全为一类时退出,返回叶子节点类标
for i=1:length(ValRecords)
if(length(ValRecords(i).matrix)==size(DataSet,1))
break;
end
end
Tree.Attribut=i;
Tree.Child=[];
return;
end
if(length(Attributs)==0) %当条件属性个数为0时返回占多数的类标
mostlabelnum=0;
mostlabel=0;
for i=1:length(ValRecords)
if(length(ValRecords(i).matrix)>mostlabelnum)
mostlabelnum=length(ValRecords(i).matrix);
mostlabel=i;
end
end
Tree.Attribut=mostlabel;
Tree.Child=[];
return;
end
for i=1:length(Attributs)
[Sa(i) ValRecord]=ComputEntropy(DataSet,i);
Gains(i)=S-Sa(i);
AtrributMatric(i).val=ValRecord;
end
[maxval maxindex]=max(Gains);
Tree.Attribut=Attributs(maxindex);
Attributs2=[Attributs(1:maxindex-1) Attributs(maxindex+1:length(Attributs))];
for j=1:length(AtrributMatric(maxindex).val)
DataSet2=[DataSet(AtrributMatric(maxindex).val(j).matrix',1:maxindex-1) DataSet(AtrributMatric(maxindex).val(j).matrix',maxindex+1:size(DataSet,2))];
if(size(DataSet2,1)==0)
mostlabelnum=0;
mostlabel=0;
for i=1:length(ValRecords)
if(length(ValRecords(i).matrix)>mostlabelnum)
mostlabelnum=length(ValRecords(i).matrix);
mostlabel=i;
end
end
Tree.Child(j).root.Attribut=mostlabel;
Tree.Child(j).root.Child=[];
else
Tree.Child(j).root=CreatTree(DataSet2,Attributs2);
end
end
end
function [Entropy RecordVal]=ComputEntropy(DataSet,attribut) %计算信息熵
if(attribut==0)
clnum=0;
for i=1:size(DataSet,1)
if(DataSet(i,size(DataSet,2))>clnum) %防止下标越界
classnum(DataSet(i,size(DataSet,2)))=0;
clnum=DataSet(i,size(DataSet,2));
RecordVal(DataSet(i,size(DataSet,2))).matrix=[];
end
classnum(DataSet(i,size(DataSet,2)))=classnum(DataSet(i,size(DataSet,2)))+1;
RecordVal(DataSet(i,size(DataSet,2))).matrix=[RecordVal(DataSet(i,size(DataSet,2))).matrix i];
end
Entropy=0;
for j=1:length(classnum)
P=classnum(j)/size(DataSet,1);
if(P~=0)
Entropy=Entropy+(-P)*log2(P);
end
end
else
valnum=0;
for i=1:size(DataSet,1)
if(DataSet(i,attribut)>valnum) %防止参数下标越界
clnum(DataSet(i,attribut))=0;
valnum=DataSet(i,attribut);
Valueexamnum(DataSet(i,attribut))=0;
RecordVal(DataSet(i,attribut)).matrix=[]; %将编号保留下来,以方便后面按值分割数据集
end
if(DataSet(i,size(DataSet,2))>clnum(DataSet(i,attribut))) %防止下标越界
Value(DataSet(i,attribut)).classnum(DataSet(i,size(DataSet,2)))=0;
clnum(DataSet(i,attribut))=DataSet(i,size(DataSet,2));
end
Value(DataSet(i,attribut)).classnum(DataSet(i,size(DataSet,2)))= Value(DataSet(i,attribut)).classnum(DataSet(i,size(DataSet,2)))+1;
Valueexamnum(DataSet(i,attribut))= Valueexamnum(DataSet(i,attribut))+1;
RecordVal(DataSet(i,attribut)).matrix=[RecordVal(DataSet(i,attribut)).matrix i];
end
Entropy=0;
for j=1:valnum
Entropys=0;
for k=1:length(Value(j).classnum)
P=Value(j).classnum(k)/Valueexamnum(j);
if(P~=0)
Entropys=Entropys+(-P)*log2(P);
end
end
Entropy=Entropy+(Valueexamnum(j)/size(DataSet,1))*Entropys;
end
end
end
function showTree(Tree,level,value,branch,AttributValue,AttributName)
blank=[];
for i=1:level-1
if(branch(i)==1)
blank=[blank ' |'];
else
blank=[blank ' '];
end
end
blank=[blank ' '];
if(level==0)
blank=[' (The Root):'];
else
if isempty(AttributValue)
blank=[blank '|_____' int2str(value) '______'];
else
blank=[blank '|_____' value '______'];
end
end
if(length(Tree.Child)~=0) %非叶子节点
if isempty(AttributName)
disp([blank 'Attribut ' int2str(Tree.Attribut)]);
else
disp([blank 'Attribut ' AttributName{ Tree.Attribut}]);
end
if isempty(AttributValue)
for j=1:length(Tree.Child)-1
showTree(Tree.Child(j).root,level+1,j,[branch 1],AttributValue,AttributName);
end
showTree(Tree.Child(length(Tree.Child)).root,level+1,length(Tree.Child),[branch(1:length(branch)-1) 0 1],AttributValue,AttributName);
else
for j=1:length(Tree.Child)-1
showTree(Tree.Child(j).root,level+1,AttributValue{ Tree.Attribut}{ j},[branch 1],AttributValue,AttributName);
end
showTree(Tree.Child(length(Tree.Child)).root,level+1,AttributValue{ Tree.Attribut}{ length(Tree.Child)},[branch(1:length(branch)-1) 0 1],AttributValue,AttributName);
end
else
if isempty(AttributValue)
disp([blank 'leaf ' int2str(Tree.Attribut)]);
else
disp([blank 'leaf ' AttributValue{ length(AttributValue)}{ Tree.Attribut}]);
end
end
end
function Rules=getRule(Tree)
if(length(Tree.Child)~=0)
Rules={ };
for i=1:length(Tree.Child)
content=getRule(Tree.Child(i).root);
%disp(content);
%disp([num2str(Tree.Attribut) ',' num2str(i) ',']);
for j=1:size(content,1)
rule=cell2struct(content(j,1),{ 'str'});
content(j,1)={ [num2str(Tree.Attribut) ',' num2str(i) ',' rule.str]};
end
Rules=[Rules;content];
end
else
Rules={ ['C' num2str(Tree.Attribut)]};
end
end
3. torch.utils里需要掌握的函数
在深度学习框架PyTorch中,torch.utils模块提供了许多实用工具,帮助我们有效地处理和加载数据。其中几个关键组件包括:
1. DataLoader:这是数据加载的核心工具,它封装了Dataset类,使得我们可以并行加载和处理数据,提高训练效率。使用DataLoader时,要特别注意add方法的运用。
2. Dataset:有Map-style的TensorDataset,它允许我们将数据和标签打包成Tensor,便于在索引过程中同时获取数据和对应的标签。源代码如下:
python
dataset = TensorDataset(data, labels)
3. IterableDataset:例如IterableDataset,其加载数据的方式更像迭代器,适用于需要逐批处理的pb11源码数据源。同样,add方法在使用时也需要注意:
python
iterable_dataset = IterableDataset()
iterable_dataset.add(...)
4. ConcatDataset和ChainDataset:前者用于连接多个Dataset,后者则适用于连接多个IterableDataset,方便处理多源数据集。
5. Subset:用于从一个Dataset中提取指定索引序列的子集,这对于数据增强或者验证集划分非常有用。
通过熟练掌握这些torch.utils中的函数,我们可以更有效地组织和处理数据,提高模型训练的灵活性和性能。
详解数据读取--Dataset, Samper, Dataloader
在使用Pytorch进行模型训练时,数据读取过程常涉及到Dataset、Dataloader以及Sampler三个核心组件。通常情况下,我们自定义一个继承自Dataset的类来创建数据集,并作为Dataloader的初始化参数。Dataloader则根据初始化参数如batch_size和shuffle等完成数据加载。本文将深入解析这三个组件如何协同作用,完成数据读取任务。
在构建Dataloader时,两个关键参数sampler和batch_sampler及collate_fn通常被指定。sampler需要继承自torch.utils.data.Sampler类,而collate_fn通常是一个函数。未指定时它们具有默认值。数据读取流程是由Dataset、Dataloader和Sampler共同完成的。本文章将通过源码解析它们如何协同工作。
在理解Dataset、Dataloader和Sampler的免安装asp源码联动之前,我们先对迭代器和生成器的概念进行梳理。迭代器iterator和可迭代对象iterable是Python中用于数据遍历的基础概念。一个iterable对象能够通过`iter()`函数获取其对应的iterator对象,而iterator对象在遍历时通过`next()`函数获取iterable中的下一个元素。实际上,for循环的`in`操作符在背后依赖于iterable和iterator的相互作用。
生成器generator是一种特殊的迭代器,具有`yield`关键字,可以实现函数的暂停与恢复,非常适合用于生成序列数据。其操作方式类似于函数调用,但能暂停执行并在需要时恢复,生成序列数据。
在数据读取流程中,Dataloader创建的迭代器最终指向Dataset。具体实现中,Dataloader首先初始化一个iterator对象,通常基于自定义的Sampler。当使用for循环遍历Dataloader时,实际上在遍历这个迭代器。Sampler负责确定数据读取顺序,而Dataset提供实际的数据点。Dataloader内部实现了一个`_next_data()`函数,负责从Dataset中提取并打包成批次数据,再通过`collate_fn`处理,最终生成训练批次。
在Dataloader中,`_next_index()`函数用于获取下一个批次的php 公众号 源码索引。这些索引由Sampler生成,通常基于随机或顺序策略。获取索引后,Dataloader使用`_dataset_fetcher.fetch(index)`从Dataset中读取数据点。Dataset可能根据其类型(如`IterableDataset`或继承自`Dataset`的自定义类)实现具体的读取逻辑,通常通过`__getitem__`方法获取指定索引的数据。
最后,数据点通过`collate_fn`进行打包,确保批次中的数据结构一致,适应模型训练的需求。整个过程展示了Dataset、Dataloader和Sampler如何协同工作,从数据集读取数据点,确定读取顺序,到最终生成可用于模型训练的批次数据。
综上所述,理解Dataset、Dataloader和Sampler的协同作用是构建高效数据加载系统的关键。通过精心设计这些组件,可以显著提高数据处理效率,优化模型训练过程。
PyTorch - DataLoader 源码解析(一)
本文为作者基于个人经验进行的初步解析,由于能力有限,可能存在遗漏或错误,敬请各位批评指正。
本文并未全面解析 DataLoader 的全部源码,仅对 DataLoader 与 Sampler 之间的联系进行了分析。以下内容均基于单线程迭代器代码展开,分类平台整站源码多线程情况将在后续文章中阐述。
以一个简单的数据集遍历代码为例,在循环中,数据是如何从 loader 中被取出的?通过断点调试,我们发现循环时,代码进入了 torch.utils.data.DataLoader 类的 __iter__() 方法,具体内容如下:
可以看到,该函数返回了一个迭代器,主要由 self._get_iterator() 和 self._iterator._reset(self) 提供。接下来,我们进入 self._get_iterator() 方法查看迭代器的产生过程。
在此方法中,根据 self.num_workers 的数量返回了不同的迭代器,主要区别在于多线程处理方式不同,但这两种迭代器都是继承自 _BaseDataLoaderIter 类。这里我们先看单线程下的例子,进入 _SingleProcessDataLoaderIter(self)。
构造函数并不复杂,在父类的构造器中执行了大量初始化属性,然后在自己的构造器中获得了一个 self._dataset_fetcher。此时继续单步前进断点,发现程序进入到了父类的 __next__() 方法中。
在分析代码之前,我们先整理一下目前得到的信息:
下面是 __next__() 方法的内容:
可以看到最后返回的是变量 data,而 data 是由 self._next_data() 生成的,进入这个方法,我们发现这个方法由子类负责实现。
在这个方法中,我们可以看到数据从 self._dataset_fecther.fetch() 中得到,需要依赖参数 index,而这个 index 由 self._next_index() 提供。进入这个方法可以发现它是由父类实现的。
而前面的 index 实际上是由这个 self._sampler_iter 迭代器提供的。查找 self._sampler_iter 的定义,我们发现其在构造函数中。
仔细观察,我们可以在倒数第 4 行发现 self._sampler_iter = iter(self._index_sampler),这个迭代器就是这里的 self._index_sampler 提供的,而 self._index_sampler 来自 loader._index_sampler。这个 loader 就是最外层的 DataLoader。因此我们回到 DataLoader 类中查看这个 _index_sampler 是如何得到的。
我们可以发现 _index_sampler 是一个由 @property 装饰得到的属性,会根据 self._auto_collation 来返回 self.batch_sampler 或者 self.sampler。再次整理已知信息,我们可以得到:
因此,只要知道 batch_sampler 和 sampler 如何返回 index,就能了解整个流程。
首先发现这两个属性来自 DataLoader 的构造函数,因此下面先分析构造函数。
由于构造函数代码量较大,因此这里只关注与 Sampler 相关的部分,代码如下:
在这里我们只关注以下部分:
代码首先检查了参数的合法性,然后进行了一轮初始化属性,接着判断了 dataset 的类型,处理完特殊情况。接下来,函数对参数冲突进行了判断,共判断了 3 种参数冲突:
检查完参数冲突后,函数开始创建 sampler 和 batch_sampler,如下图所示:
注意,仅当未指定 sampler 时才会创建 sampler;同理,仅在未指定 batch_sampler 且存在 batch_size 时才会创建 batch_sampler。
在 DataLoader 的构造函数中,如果不指定参数 batch_sampler,则默认创建 BatchSampler 对象。该对象需要一个 Sampler 对象作为参数参与构造。这也是在构造函数中,batch_sampler 与 sampler 冲突的原因之一。因为传入一个 batch_sampler 时,说明 sampler 已经作为参数完成了 batch_sampler 的构造,若再将 sampler 传入 DataLoader 是多余的。
以第一节中的简单代码为例,此时并未指定 Sampler 和 batch_sampler,也未指定 batch_size,默认为 1,因此在 DataLoader 构造时,创建了一个 SequencialSampler,并传入了 BatchSampler 进行构建。继续第一节中的断点,可以发现:
具体使用 sampler 还是 batch_sampler 来生成 index,取决于 _auto_collation,而从上面的代码发现,只要存在 self.batch_sampler 就永远使用 batch_sampler 来生成。batch_sampler 与 sampler 冲突的原因之二:若不设置冲突,那么使用者试图同时指定 batch_sampler 与 sampler 后,尤其是在使用者继承了新的 Sampler 子类后, sampler 在获取数据的时候完全没有被使用,这对开发者来说是一个困惑的现象,容易引起不易察觉的 BUG。
继续断点发现程序进入了 BatchSampler 的 __iter__() 方法,代码如下:
从代码中可以发现,程序不停地从 self.sampler 中获取 idx 加入列表,直到填满一个 batch 的量,并将这一整个 batch 的 index 返回到迭代器的 _next_data()。
此处由 self._dataset_fetcher.fetch(index) 来获取真正的数据,进入函数后看到:
这里依然根据 self.auto_collation(来自 DataLoader._auto_collation)进行分别处理,但是总体逻辑都是通过 self.dataset[] 来调用 Dataset 对象的 __getitem__() 方法。
此处的 Dataset 是来自 torchvision 的 DatasetFolder 对象,这里读取文件路径中的后,经过转换变为 Tensor 对象,与标签 target 一起返回。参数中的 index 是由迭代器的 self._dataset_fetcher.fetch() 传入。
整个获取数据的流程可以用以下流程图简略表示:
注意:
另附:
对于一条循环语句,在执行过程中发生了以下事件:
Pytorch_循ç¯ç¥ç»ç½ç»RNN
RNNæ¯Recurrent Neural Networksç缩åï¼å³å¾ªç¯ç¥ç»ç½ç»ï¼å®å¸¸ç¨äºè§£å³åºåé®é¢ãRNNæè®°å¿åè½ï¼é¤äºå½åè¾å ¥ï¼è¿æä¸ä¸æç¯å¢ä½ä¸ºé¢æµçä¾æ®ãå®å¸¸ç¨äºè¯é³è¯å«ãç¿»è¯çåºæ¯ä¹ä¸ãRNNæ¯åºå模åçåºç¡ï¼å°½ç®¡è½å¤ç´æ¥è°ç¨ç°æçRNNç®æ³ï¼ä½åç»çå¤æç½ç»å¾å¤æ建å¨RNNç½ç»çåºç¡ä¹ä¸ï¼å¦Attentionæ¹æ³éè¦ä½¿ç¨RNNçéèå±æ°æ®ãRNNçåç并ä¸å¤æï¼ä½ç±äºå ¶ä¸å æ¬å¾ªç¯ï¼å¾é¾ç¨è¯è¨æè ç»å¾æ¥æè¿°ï¼æ好çæ¹æ³æ¯èªå·±æå¨ç¼åä¸ä¸ªRNNç½ç»ãæ¬ç¯å°ä»ç»RNNç½ç»çåçåå ·ä½å®ç°ã
å¨å¦ä¹ 循ç¯ç¥ç»ç½ç»ä¹åï¼å ççä»ä¹æ¯åºåãåºåsequenceç®ç§°seqï¼æ¯æå å顺åºçä¸ç»æ°æ®ãèªç¶è¯è¨å¤çæ¯æä¸ºå ¸åçåºåé®é¢ï¼æ¯å¦å°ä¸å¥è¯ç¿»è¯æå¦ä¸å¥è¯æ¶ï¼å ¶ä¸æ个è¯æ±çå«ä¹ä¸ä» åå³äºå®æ¬èº«ï¼è¿ä¸å®ååçå¤ä¸ªåè¯ç¸å ³ã类似çï¼å¦ææ³é¢æµçµå½±çæ èåå±ï¼ä¸ä» ä¸å½åçç»é¢æå ³ï¼è¿ä¸å½åçä¸ç³»ååæ æå ³ãå¨ä½¿ç¨åºå模åé¢æµçè¿ç¨ä¸ï¼è¾å ¥æ¯åºåï¼èè¾åºæ¯ä¸ä¸ªæå¤ä¸ªé¢æµå¼ã
å¨ä½¿ç¨æ·±åº¦å¦ä¹ 模å解å³åºåé®é¢æ¶ï¼æ容ææ··æ·çæ¯ï¼åºåä¸åºåä¸çå ç´ ãå¨ä¸åçåºæ¯ä¸ï¼å®ä¹åºåçæ¹å¼ä¸åï¼å½åæåè¯çææ è²å½©æ¶ï¼ä¸ä¸ªåè¯æ¯ä¸ä¸ªåºåseqï¼å½åæå¥åææ è²å½©æ¶ï¼ä¸ä¸ªå¥åæ¯ä¸ä¸ªseqï¼å ¶ä¸çæ¯ä¸ªåè¯æ¯åºåä¸çå ç´ ï¼å½åææç« ææ è²å½©æ¶ï¼ä¸ç¯æç« æ¯ä¸ä¸ªseqãç®åå°è¯´ï¼seqæ¯æç»ä½¿ç¨æ¨¡åæ¶çè¾å ¥æ°æ®ï¼ç±ä¸ç³»åå ç´ ç»æã
å½åæå¥åçææ è²å½©æ¶ï¼ä»¥å¥ä¸ºseqï¼èå¥ä¸å å«çå个åè¯çå«ä¹ï¼ä»¥ååè¯é´çå ³ç³»æ¯å ·ä½åæç对象ï¼æ¤æ¶ï¼åè¯æ¯åºåä¸çå ç´ ï¼æ¯ä¸ä¸ªåè¯åå¯æå¤ç»´ç¹å¾ãä»åè¯ä¸æåç¹å¾çæ¹æ³å°å¨åé¢çèªç¶è¯è¨å¤çä¸ä»ç»ã
RNNæå¾å¤ç§å½¢å¼ï¼å个è¾å ¥å个è¾å ¥ï¼å¤ä¸ªè¾å ¥å¤ä¸ªè¾åºï¼å个è¾å ¥å¤ä¸ªè¾åºççã
举个æç®åçä¾åï¼ç¨æ¨¡åé¢æµä¸ä¸ªååçè¯çææ è²å½©ï¼å®çè¾å ¥ä¸ºå个å ç´ X={ x1,x2,x3,x4}ï¼å®çè¾åºä¸ºå个å¼Y={ y1}ãåçæå顺åºè³å ³éè¦ï¼æ¯å¦âä»å¥½ååâåâä»åå好âï¼è¡¨è¾¾çææå®å ¨ç¸åãä¹æ以è¾å ¥è¾åºç个æ°ä¸éè¦ä¸ä¸å¯¹åºï¼æ¯å 为ä¸é´çéèå±ï¼åååå¨ä¸é´ä¿¡æ¯ã
å¦ææ模å设æ³æé»çï¼å¦ä¸å¾æ示ï¼
å¦æ模å使ç¨å ¨è¿æ¥ç½ç»ï¼å¨æ¯æ¬¡è¿ä»£æ¶ï¼æ¨¡åå°è®¡ç®å个å ç´ x1,x2...ä¸å个ç¹å¾f1,f2...ä»£å ¥ç½ç»ï¼æ±å®ä»¬å¯¹ç»æyçè´¡ç®åº¦ã
RNNç½ç»åè¦å¤æä¸äºï¼å¨æ¨¡åå é¨ï¼å®ä¸æ¯å°åºåä¸ææå ç´ çç¹å¾ä¸æ¬¡æ§è¾å ¥æ¨¡åï¼èæ¯æ¯ä¸æ¬¡å°åºåä¸å个å ç´ çç¹å¾è¾å ¥æ¨¡åï¼ä¸å¾æè¿°äºRNNçæ°æ®å¤çè¿ç¨ï¼å·¦å¾ä¸ºåæ¥å±ç¤ºï¼å³å¾å°æææ¶åºæ¥éª¤æ½è±¡æåä¸æ¨¡åã
第ä¸æ¥ï¼å°ç¬¬ä¸ä¸ªå ç´ x1çç¹å¾f1,f2...è¾å ¥æ¨¡åï¼æ¨¡åæ ¹æ®è¾å ¥è®¡ç®åºéèå±hã
第äºæ¥ï¼å°ç¬¬äºä¸ªå ç´ x2çç¹å¾è¾å ¥æ¨¡åï¼æ¨¡åæ ¹æ®è¾å ¥åä¸ä¸æ¥äº§ççhå计ç®éèå±hï¼å ¶å®å ç´ ä»¥æ¤ç±»æ¨ã
第ä¸æ¥ï¼å°æåä¸ä¸ªå ç´ xnçç¹å¾è¾å ¥æ¨¡åï¼æ¨¡åæ ¹æ®è¾å ¥åä¸ä¸æ¥äº§ççh计ç®éèå±håé¢æµå¼yã
éèå±hå¯è§ä¸ºå°åºåä¸åé¢å ç´ çç¹å¾åä½ç½®éè¿ç¼ç ååä¼ éï¼ä»è对è¾åºyåçä½ç¨ï¼éèå±ç大å°å³å®äºæ¨¡åæºå¸¦ä¿¡æ¯éçå¤å°ãéèå±ä¹å¯ä»¥ä½ä¸ºæ¨¡åçè¾å ¥ä»å¤é¨ä¼ å ¥ï¼ä»¥åä½ä¸ºæ¨¡åçè¾åºè¿åç»å¤é¨è°ç¨ã
æ¬ä¾ä»ä½¿ç¨ä¸ç¯ä¸çèªç©ºä¹å®¢åºåæ°æ®ï¼åå«ç¨ä¸¤ç§æ¹æ³å®ç°RNNï¼èªå·±ç¼åç¨åºå®ç°RNN模åï¼ä»¥åè°ç¨Pytorchæä¾çRNN模åãåä¸ç§æ¹æ³ä¸»è¦ç¨äºåæåçï¼åä¸ç§ç¨äºå±ç¤ºå¸¸ç¨çè°ç¨æ¹æ³ã
é¦å å¯¼å ¥å¤´æ件ï¼è¯»åä¹å®¢æ°æ®ï¼åå½ä¸åå¤çï¼å¹¶å°æ°æ®åå为æµè¯éåè®ç»éï¼ä¸ä¹åä¸åçæ¯å å ¥äºcreate_datasetå½æ°ï¼ç¨äºçæåºåæ°æ®ï¼åºåçè¾å ¥é¨åï¼æ¯ä¸ªå ç´ ä¸å æ¬ä¸¤ä¸ªç¹å¾ï¼åä¸ä¸ªæçä¹å®¢éprevåæ份å¼monï¼è¿éçæ份å¼å¹¶ä¸æ¯å ³é®ç¹å¾ï¼ä¸»è¦ç¨äºå¨ä¾ç¨ä¸å±ç¤ºå¦ä½ä½¿ç¨å¤ä¸ªç¹å¾ã
第ä¸æ¥ï¼å®ç°æ¨¡åç±»ï¼æ¤ä¾ä¸çRNN模åé¤äºå ¨è¿æ¥å±ï¼è¿çæäºä¸ä¸ªéèå±ï¼å¹¶å¨ä¸ä¸æ¬¡ååä¼ ææ¶å°éèå±è¾åºçæ°æ®ä¸è¾å ¥æ°æ®ç»åååä»£å ¥æ¨¡åè¿ç®ã
第äºæ¥ï¼è®ç»æ¨¡åï¼ä½¿ç¨å ¨é¨æ°æ®è®ç»æ¬¡ï¼å¨æ¯æ¬¡è®ç»æ¶ï¼å é¨for循ç¯å°åºåä¸çæ¯ä¸ªå ç´ ä»£å ¥æ¨¡åï¼å¹¶å°æ¨¡åè¾åºçéèå±åä¸ä¸ä¸ªå ç´ ä¸èµ·éå ¥ä¸ä¸æ¬¡è¿ä»£ã
第ä¸æ¥ï¼é¢æµåä½å¾ï¼é¢æµçè¿ç¨ä¸è®ç»ä¸æ ·ï¼æå ¨é¨æ°æ®æåæå ç´ ä»£å ¥æ¨¡åï¼å¹¶å°æ¯ä¸æ¬¡é¢æµç»æåå¨å¨æ°ç»ä¸ï¼å¹¶ä½å¾æ¾ç¤ºã
éè¦æ³¨æçæ¯ï¼å¨è®ç»åé¢æµè¿ç¨ä¸ï¼æ¯ä¸æ¬¡å¼å§è¾å ¥æ°åºåä¹åï¼é½éç½®äºéèå±ï¼è¿æ¯ç±äºéèå±çå 容åªä¸å½ååºåç¸å ³ï¼åºåä¹é´å¹¶æ è¿ç»æ§ã
ç¨åºè¾åºç»æå¦ä¸å¾æ示ï¼
ç»è¿æ¬¡è¿ä»£ï¼ä½¿ç¨RNNçææææ¾ä¼äºä¸ä¸ç¯ä¸ä½¿ç¨å ¨è¿æ¥ç½ç»çæåææï¼è¿å¯ä»¥éè¿è°æ´è¶ åæ°ä»¥åéæ©ä¸åç¹å¾ï¼è¿ä¸æ¥ä¼åã
使ç¨Pytorchæä¾çRNN模åï¼torch.nn.RNNç±»å¯ç´æ¥ä½¿ç¨ï¼æ¯å¾ªç¯ç½ç»æ常ç¨ç解å³æ¹æ¡ãRNNï¼LSTMï¼GRUç循ç¯ç½ç»é½å®ç°å¨åä¸æºç æ件torch/nn/modules/rnn.pyä¸ã
第ä¸æ¥ï¼å建模åï¼æ¨¡åå å«ä¸¤é¨åï¼ç¬¬ä¸é¨åæ¯Pytorchæä¾çRNNå±ï¼ç¬¬äºé¨åæ¯ä¸ä¸ªå ¨è¿æ¥å±ï¼ç¨äºå°RNNçè¾åºè½¬æ¢æè¾åºç®æ ç维度ã
PytorchçRNNååä¼ æå 许å°éèå±æ°æ®hä½ä¸ºåæ°ä¼ å ¥æ¨¡åï¼å¹¶å°æ¨¡å产ççhåyä½ä¸ºå½æ°è¿åå¼ãå½¢å¦ï¼ pred, h_state = model(x, h_state)
ä»ä¹æ åµä¸éè¦æ¥æ¶éèå±çç¶æh_stateï¼å¹¶è½¬å ¥ä¸ä¸æ¬¡è¿ä»£å¢ï¼å½å¤çå个seqæ¶ï¼hå¨å é¨ååä¼ éï¼å½åºåä¸åºåä¹é´ä¹åå¨ååä¾èµå ³ç³»æ¶ï¼å¯ä»¥æ¥æ¶h_stateå¹¶ä¼ å ¥ä¸ä¸æ¥è¿ä»£ãå¦å¤ï¼å½æ¨¡åæ¯è¾å¤æå¦LSTM模åå å«ä¼å¤åæ°ï¼ä¼ éä¼å¢å 模åçå¤æ度ï¼ä½¿è®ç»è¿ç¨åæ ¢ãæ¬ä¾æªå°éèå±è½¬å°æ¨¡åå¤é¨ï¼è¿æ¯ç±äºæ¨¡åå é¨å®ç°äºå¯¹æ´ä¸ªåºåçå¤çï¼èéå¤çå个å ç´ ï¼èæ¯æ¬¡ä»£å ¥çåºåä¹é´å没æè¿ç»æ§ã
第äºæ¥ï¼è®ç»æ¨¡åï¼ä¸ä¸ä¾ä¸æåºåä¸çå ç´ éä¸ªä»£å ¥æ¨¡åä¸åï¼æ¬ä¾ä¸æ¬¡æ§ææ´ä¸ªåºåä»£å ¥äºæ¨¡åï¼å æ¤ï¼åªæä¸ä¸ªfor循ç¯ã
Pythorchæ¯ææ¹éå¤çï¼ååä¼ éæ¶è¾å ¥æ°æ®æ ¼å¼æ¯[seq_len, batch_size, input_dim)ï¼æ¬ä¾ä¸è¾å ¥æ°æ®ç维度æ¯[, 1, 2]ï¼input_dimæ¯æ¯ä¸ªå ç´ çç¹å¾æ°ï¼batch_sizeæ¯è®ç»çåºå个æ°ï¼seq_lenæ¯åºåçé¿åº¦ï¼è¿é使ç¨%ä½ä¸ºè®ç»æ°æ®ï¼seq_len为ãå¦ææ°æ®ç»´åº¦ç顺åºä¸è¦æ±ä¸ä¸è´ï¼ä¸è¬ä½¿ç¨transpose转æ¢ã
第ä¸æ¥ï¼é¢æµåä½å¾ï¼å°å ¨é¨æ°æ®ä½ä¸ºåºåä»£å ¥æ¨¡åï¼å¹¶ç¨é¢æµå¼ä½å¾ã
ç¨åºè¾åºç»æå¦ä¸å¾æ示ï¼
å¯ä»¥çå°ï¼ç»è¿æ¬¡è¿ä»£ï¼å¨å个å ç´ çè®ç»éä¸æåå¾å¾å¥½ï¼ä½å¨æµè¯éææè¾å·®ï¼å¯è½åå¨è¿æåã
分求一个用VB.net做的简单网页的代码,谢谢!!!
用vb.net做的校友录……(附所有源代码)
来源:不详 作者 佚名 点击数: 录入时间:-- ::
想必大家都上过校友录吧,里面的功能虽然不是很强大,但是为我们这些毕业之后各奔西东的学子来说,到真是提供了一个好的聚集点,下面是我用vb.net做的校友录,当然也不能说是校友录了,只能说是我们班的学友录了:)不过只要你掌握了这种编程思想,校友录就不在话下了。这里我将重点谈一下关于管理员权限赋予。
以前有这个想法的时候,难就难在管理员身份的赋予上,开始想如果一般用户在被提升为管理员之后,我可以把他的信息转到另外一个表中,以后登陆的时候先检查manage表中是否有他就行了,这种办法我已经实现了,是不是有些笨……可是正在我要正式开工的时候,一个想法突然冒了出来,是什么呢?呵呵,就是在数据库中再增加一个字段了如果是第一次注册就让这个字段item(int)的值为0,要是被提升之后就update为1,班级创始人呢?当然了,在他申请时付给他一个班级id,然后先判断班级id为这个已经注册的人信息条数是否为0,如果是,那么就付给他item=2好了。下面的代码中,我没有实现这个功能,因为我做的是班友录的,当然了,我就是管理员喽:)
在这里,我使用的是checkboxlist(两个),一个用来转换数据(visibe=fause),一个用来显示数据,还有一个checkbox用来写全部选中的事件。当然了还有两个按钮事件,一个是用来提升为管理员的,一个是用来降级为一般用户的,这两个按钮在判断为一般用户时
enable都是为fause的,只有当判断登录为管理员时才为true。当然了,如果你是班级创始人,是不可能被降级的:)
这里用来显示信息的我用的是一个datagrid,当判断为非管理员时,删除栏的visible将为fause,为管理员的时候,才为true,也就是说只有管理员才可以删除信息。而不是注册的用户是不能发言的所有的按钮控件的enable将都为fause。
代码如下:board.aspx
<%@ Page Language="vb" AutoEventWireup="false" Codebehind="boaman.aspx.vb" Inherits="_re1.boaman"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<title></title>
<meta content="Microsoft Visual Studio.NET 7.0" name="GENERATOR">
<meta content="Visual Basic 7.0" name="CODE_LANGUAGE">
<meta content="javascript" name="vs_defaultClientScript">
<meta content="/intellisense/ie5" name="vs_targetSchema">
</HEAD>
<body background="image/bg.gif" MS_POSITIONING="GridLayout">
<form id="Form1" method="post" runat="server">
<asp:checkbox id="yourcheck" style="Z-INDEX: ; LEFT: px; POSITION: absolute; TOP: px" runat="server" Text="全部选中" AutoPostBack="True" ForeColor="SaddleBrown" Font-Bold="True"></asp:checkbox>
<asp:button id="Button1" style="Z-INDEX: ; LEFT: px; POSITION: absolute; TOP: px" runat="server" Text="提升为管理员" Height="px" Width="px" BackColor="Gainsboro" BorderColor="Lavender" BorderWidth="2px" BorderStyle="Outset"></asp:button>
<asp:button id="Button2" style="Z-INDEX: ; LEFT: px; POSITION: absolute; TOP: px" runat="server" Text="降级为一般用户" Height="px" Width="px" BackColor="Gainsboro" BorderColor="Lavender" BorderWidth="2px" BorderStyle="Outset"></asp:button>
<asp:checkboxlist id="CheckBoxList1" style="Z-INDEX: ; LEFT: px; POSITION: absolute; TOP: px" runat="server" Visible="False"></asp:checkboxlist>
<asp:checkboxlist id="mycheck" style="Z-INDEX: ; LEFT: px; POSITION: absolute; TOP: px" runat="server" ForeColor="Navy" Font-Size="X-Small"></asp:checkboxlist>
<asp:label id="Label1" style="Z-INDEX: ; LEFT: px; POSITION: absolute; TOP: px" runat="server" ForeColor="Red" Font-Names="方正姚体">(已注册用户)</asp:label>
<asp:image id="Image1" style="Z-INDEX: ; LEFT: px; POSITION: absolute; TOP: px" runat="server" Height="px" Width="px" ImageUrl="image/re1-1.gif"></asp:image>
<asp:datagrid id="DataGrid1" style="Z-INDEX: ; LEFT: px; POSITION: absolute; TOP: px" runat="server" Height="px" Width="px" BorderColor="#ffcc" AutoGenerateColumns="False" HeaderStyle-Font-Size="9" HeaderStyle-HorizontalAlign="Center" HeaderStyle-ForeColor="red" HeaderStyle-Font-Bold="True">
<Columns>
<asp:HyperLinkColumn ItemStyle-ForeColor="navy" ItemStyle-HorizontalAlign="Center" ItemStyle-Height="" ItemStyle-Font-Size="9" DataNavigateUrlField="stu_id" DataNavigateUrlFormatString="querry.aspx?stu_id={ 0}" DataTextField="stu_id" HeaderText="学号"></asp:HyperLinkColumn>
<asp:BoundColumn ItemStyle-ForeColor="navy" ItemStyle-HorizontalAlign="Center" ItemStyle-Width="" ItemStyle-Font-Size="9" DataField="tel" HeaderText="电话"></asp:BoundColumn>
<asp:BoundColumn ItemStyle-ForeColor="navy" ItemStyle-HorizontalAlign="Center" ItemStyle-Width="" ItemStyle-Font-Size="9" DataField="oicq" HeaderText="OICQ"></asp:BoundColumn>
<asp:BoundColumn ItemStyle-ForeColor="navy" ItemStyle-HorizontalAlign="Center" ItemStyle-Width="" ItemStyle-Font-Size="9" DataField="email" HeaderText="E-mail"></asp:BoundColumn>
<asp:BoundColumn ItemStyle-ForeColor="navy" ItemStyle-HorizontalAlign="Center" ItemStyle-Width="" ItemStyle-Font-Size="9" DataField="point" HeaderText="登录次数"></asp:BoundColumn>
</Columns>
</asp:datagrid>
</form>
</body>
</HTML>
下面是codebehind中的内容:boaman.asp.vb
Imports System.Data
Imports System.Data.SqlClient
Public Class boaman
Inherits System.Web.UI.Page
Protected WithEvents yourcheck As System.Web.UI.WebControls.CheckBox
Protected WithEvents Button1 As System.Web.UI.WebControls.Button
Protected WithEvents CheckBoxList1 As System.Web.UI.WebControls.CheckBoxList
Protected WithEvents mycheck As System.Web.UI.WebControls.CheckBoxList
Protected WithEvents Label1 As System.Web.UI.WebControls.Label
Protected WithEvents Image1 As System.Web.UI.WebControls.Image
Protected WithEvents DataGrid1 As System.Web.UI.WebControls.DataGrid
Protected WithEvents Button2 As System.Web.UI.WebControls.Button
#Region " Web Form Designer Generated Code "
'This call is required by the Web Form Designer.
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
End Sub
Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
'CODEGEN: This method call is required by the Web Form Designer
'Do not modify it using the code editor.
InitializeComponent()
End Sub
#End Region
Dim conn As SqlConnection = New SqlConnection("server=lixinri;uid=sa;pwd=;database=re1")
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'////////////////////判断是否为过客
If Session("stu_id") = "" Then
Button1.Enabled = False : Button2.Enabled = False
'////////////////////调用check()事件
check()
Else
If Not IsPostBack Then
Dim sql As String = "select * from pwd where stu_id=@stu_id"
Dim comm As SqlCommand = New SqlCommand(sql, conn)
comm.Parameters.Add(New SqlParameter("@stu_id", SqlDbType.Int, 4))
comm.Parameters("@stu_id").Value = Session("stu_id")
Dim dr As SqlDataReader
conn.Open()
dr = comm.ExecuteReader
While dr.Read
If dr.Item("term") = "0" Then
'///////////////////判断是否为一般用户
dr.Close()
Button1.Enabled = False : Button2.Enabled = False
Dim sql_1 As String = "select a.stu_id as stu_id,a.term,b.name as name,b.tel as tel,b.call as oicq,b.point as point,b.email from pwd a,stu_base b where a.stu_id=b.stu_id"
Dim cmd As New SqlCommand(sql_1, conn)
dr = cmd.ExecuteReader
While dr.Read
If dr.Item("term") = "1" Then
mycheck.Items.Add("<u>" & dr.Item("name") & "</u>" & "<font color=darkorange>(管理员)</font>")
ElseIf dr.Item("term") = "2" Then
mycheck.Items.Add("<u>" & dr.Item("name") & "</u>" & "<font color=red>(班级创始人)<font>")
Else
mycheck.Items.Add("<u>" & dr.Item("name") & "</u>")
End If
CheckBoxList1.Items.Add(dr.Item("stu_id"))
End While
Else
'////////////////////判断是否为管理员
dr.Close()
Button1.Enabled = True : Button2.Enabled = True
Dim sql_1 As String = "select a.stu_id as stu_id,a.term,b.name as name,b.tel as tel,b.call as oicq,b.point as point,b.email from pwd a,stu_base b where a.stu_id=b.stu_id"
Dim cmd As New SqlCommand(sql_1, conn)
dr = cmd.ExecuteReader
While dr.Read
If dr.Item("term") = "1" Then
mycheck.Items.Add("<u>" & dr.Item("name") & "</u>" & "<font color=darkorange>(管理员)</font>")
ElseIf dr.Item("term") = "2" Then
mycheck.Items.Add("<u>" & dr.Item("name") & "</u>" & "<font color=red>(班级创始人)<font>")
Else
mycheck.Items.Add("<u>" & dr.Item("name") & "</u>")
End If
CheckBoxList1.Items.Add(dr.Item("stu_id"))
End While
End If
End While
dr.Close()
'////////////////////////取出数据,填充dataset
Dim mysql As String = "select a.stu_id as stu_id,a.term,b.name as name,b.tel as tel,b.call as oicq,b.point as point,b.email from pwd a,stu_base b where a.stu_id=b.stu_id"
comm = New SqlCommand(mysql, conn)
Dim mycomm As SqlDataAdapter = New SqlDataAdapter(mysql, conn)
Dim ds As DataSet = New DataSet()
mycomm.Fill(ds, "base")
DataGrid1.DataSource = ds.Tables("base").DefaultView
DataGrid1.DataBind()
End If
End If
End Sub
'///////////////////////书写check()事件
Sub check()
If Not IsPostBack Then
Dim mysql As String = "select a.stu_id as stu_id,a.term,b.name as name,b.tel as tel,b.call as oicq,b.point as point,b.email from pwd a,stu_base b where a.stu_id=b.stu_id"
Dim comm As New SqlCommand(mysql, conn)
Dim dr As SqlDataReader
conn.Open()
dr = comm.ExecuteReader
While dr.Read
If dr.Item("term") = "1" Then
mycheck.Items.Add("<u>" & dr.Item("name") & "</u>" & "<font color=darkorange>(管理员)</font>")
ElseIf dr.Item("term") = "2" Then
mycheck.Items.Add("<u>" & dr.Item("name") & "</u>" & "<font color=red>(班级创始人)<font>")
Else
mycheck.Items.Add("<u>" & dr.Item("name") & "</u>")
End If
CheckBoxList1.Items.Add(dr.Item("stu_id"))
End While
dr.Close()
Dim mycomm As SqlDataAdapter = New SqlDataAdapter(mysql, conn)
Dim ds As DataSet = New DataSet()
mycomm.Fill(ds, "base")
DataGrid1.DataSource = ds.Tables("base").DefaultView
DataGrid1.DataBind()
End If
End Sub
'/////////////////////填充yourcheck
Private Sub yourcheck_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles yourcheck.CheckedChanged
Dim i As Integer
For i = 0 To mycheck.Items.Count - 1
If yourcheck.Checked Then
mycheck.Items(i).Selected = True
Else
mycheck.Items(i).Selected = False
End If
Next
End Sub
'///////////////////////提升一般用户为管理员
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
conn.Open()
Dim i As Integer
For i = 0 To mycheck.Items.Count - 1
If mycheck.Items(i).Selected Then
Dim sql_1 As String = "update pwd set term=1 where stu_id=@stu_id and term=0"
Dim comm As SqlCommand = New SqlCommand(sql_1, conn)
comm.Parameters.Add(New SqlParameter("@stu_id", SqlDbType.Int, 4))
comm.Parameters("@stu_id").Value = CheckBoxList1.Items(i).Text
comm.ExecuteNonQuery()
End If
Next
Response.Redirect("boaman.aspx")
End Sub
'///////////////////////降级管理员为一般用户
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
conn.Open()
Dim i As Integer
For i = 0 To mycheck.Items.Count - 1
If mycheck.Items(i).Selected Then
Dim sql_1 As String = "update pwd set term=0 where stu_id=@stu_id and term=1"
Dim comm As SqlCommand = New SqlCommand(sql_1, conn)
comm.Parameters.Add(New SqlParameter("@stu_id", SqlDbType.Int, 4))
comm.Parameters("@stu_id").Value = CheckBoxList1.Items(i).Text
comm.ExecuteNonQuery()
End If
Next
Response.Redirect("boaman.aspx")
End Sub
End Class
当然了,这里面还有好多不足的地方,恳求高手批评指正。
校友录还有一些其它的功能就很简单了,这里就不再探讨了。
2024-11-20 06:26
2024-11-20 06:08
2024-11-20 05:14
2024-11-20 04:54
2024-11-20 04:50