赞
踩
适用于比赛数据生成
- def tensorGenReg(num_examples=1000,w=[2,-1,1],bias=True,delta=0.01,deg=1):
- """
- num_examples:创建数据集所需数据量
- w: 包括截距的特征系数向量
- bias:是否需要b
- delta:扰动项取值
- deg:方程次数
- return:生成的特征张量与标签张量
- """
- if bias==True:
- num_inputs=len(w)-1
- w_true = torch.tensor(w[:-1]).reshape(-1,1).float()
- b_true=torch.tensor(w[-1]).float()
- features_true=torch.randn(num_examples,num_inputs)
- if num_inputs==1:
- labels_true=torch.pow(features,deg)*w_true+b_true
- else:
- labels_true=torch.mm(torch.pow(features_true,deg),w_true)+b_true
- features=torch.cat(( features_true,torch.ones(len(features_true),1)),1)
- labels = labels_true+torch.randn(size=labels_true.shape)*delta#增加小偏差
- else:
- num_inputs=len(w)
- w_true = torch.tensor(w).reshape(-1,1).float()
- features=torch.randn(num_examples,num_inputs)
- if num_inputs==1:
- labels_true=torch.pow(features,deg)*w_true
- else:
- labels_true=torch.mm(torch.pow(features,deg),w_true)
- labels = labels_true+torch.randn(size=labels_true.shape)*delta#增加小偏差
- return features,labels
结果展示:
假设搞这个函数的分布图
- f,l=tensorGenReg(delta=0.01)
- plt.subplot(121)
- plt.scatter(f[:,0],l)
- plt.subplot(122)
- plt.scatter(f[:,1],l)
创建拥有两个特征的三分类数据集,每个类别500条数据,第一类别两特征值均满足均值为4,标准差为2的标准正态分布,第二类别两特征值均满足均值为-2,标准差为2的标准正态分布,第三类别两特征值均满足均值为-6,标准差为2的标准正态分布。
- torch.manual_seed(420)
-
- num_input=2
- num_examples=500
- data0=torch.normal(4,2,size=(num_examples,num_input))#均值=4,标准差=2,
- data1=torch.normal(-2,2,size=(num_examples,num_input))#均值=-2,标准差=2,
- data2=torch.normal(-6,2,size=(num_examples,num_input))#均值=-6,标准差=2,
- label0 = torch.zeros(500)
- label1 = torch.ones(500)
- label2=torch.full_like(label1,2)#仿照label1创建一个数组数值为2
- #合并数据集
- features = torch.cat((data0,data1,data2)).float()
- labels = torch.cat((label0,label1,label2)).long().reshape(-1,1)#长整型
- plt.scatter(features[:,0],features[:,1],c=labels)#数据展示
上面的方式还是比较简单的,我们可以尝试加入扰动项来加大难度(将各类的均值进行压缩,增加方差),下面提供普适性方案
- def tensorGencla(num_examples=500,num_inputs=2,num_class=3,deg_dispersion=[4,2],bias=False):
- """
- num_examples:创建数据集所需数据量
- num_inputs: 数据集特征总数
- num_class:数据集标签类别综述
- deg_dispersion:数据分布离散程度,第一个表示均值的参考值,第二个代表随机数的标准差参考值
- bias:建立模型逻辑回归模型是否带入截距
- return:生成的特征张量与标签张量
- """
- cluster_1 = torch.empty(num_examples,1) #每一类标签张量的形状
- mean_ = deg_dispersion[0]#均值参考值
- std_ =deg_dispersion[1]#标准差参考值
- lf = []#用于储存每一类特征张量的列表容器
- ll = []#用于储存每一类标签张量的列表容器
- k = mean_*(num_class+1)/2#每一类特征张量均值的惩罚因子
- for i in range(num_class):
- data_temp = torch.normal(i*mean_-k,std_,size=(num_examples,num_inputs))#生成每一类特征张量
- #i*mean_-k,(例如3,0,-3对称分布,迭代效率很快),式子为mean_*(i-(num_class+1)/2),i-最大值的一半,基本就在零附近的一组数
- lf.append(data_temp)#储存在lf中
- labels_temp=torch.full_like(cluster_1,i)
- ll.append(labels_temp)
- features = torch.cat(lf).float()
- labels = torch.cat(ll).float()
- return features,labels
- f,l=tensorGencla(deg_dispersion=[6,4])
- plt.scatter(f[:,0],f[:,1],c=l)
- plt.savefig('分类器.png', dpi=300)
(可自主构建,灵活度很高)
之前提到过, 在深度学习建模过程中,梯度下降是最常用的求解目标函数的优化方法,而针对不同类型、拥有不同函数特性的目标函数,所使用的梯度下降算法也各有不同。目前为止,我们判断小批量梯度下降 (MBGD)与Adam是为“普适”的优化算法,在这里介绍下小批量函数需要利用的过程。
- def data_iter(batch_size,features,labels):
- """
- batch_size:每个子集需要多少数据
- features:输入特征张量
- labels:输入标签张量
- return l:包含batch_size个列表,每个列表切分后的特征和标签所组成
- """
- num_examples=len(features)
- indics=list(range(num_examples))
- random.shuffle(indices)#打乱的索引
- l=[]
- for i in range(0,num_examples,batch_size):#0到num_examples,保证每次跨越为一个batch_size
- j =torch.tensor(indices[i:min(i+batch_size,num_examples)])
- #i在indices内部的索引出来的结果张量化,最后一批可能取的不是整数,
- #所以为了保证最后取值大于序列范围,用min
- l.append([torch.index_select(features,0,j),torch.index_select(labels,0,j)])
- #对features进行批量索引
- return l
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。